簡體   English   中英

出現在同一實體的不同定義中的 lambda 表達式是否產生相同的閉包類型?

[英]Do lambda expressions that appear in different definitions of a same entity produce the same closure type?

在 C++20 中,我們可以在未計算的上下文中使用 lambda 表達式。 考慮以下 C++20 代碼:

foo.cpp文件

#include <typeinfo>

struct Foo {
  using T = decltype([]{});
};  // struct Foo

const std::type_info& getType() { return typeid(typename Foo::T); }

主.cpp

#include <iostream>
#include <typeinfo>

struct Foo {
  using T = decltype([]{});
};  // struct Foo

const std::type_info& getType();

const std::type_info& getTypeFromMain() { return typeid(typename Foo::T); }

int main() {
  std::cout << std::boolalpha 
            << (getType() == getTypeFromMain());
  return 0;
}

標准C++下的程序output應該是什么?

據我所知,GCC 和 clang output false 他們認為所有 lambda 表達式都應該產生不同的閉包類型並且對翻譯單元來說是“本地的”。

另一方面, [basic.def.odr] 13.10指出,不同翻譯單元中同一實體的不同定義中相應的 lambda 表達式引入的閉包類型應該相同,程序應該 output true GCC 和 clang 錯了嗎?

的,閉包類型在所有翻譯單元中都是相同的,編譯器仍在追趕它。 這樣做的機制是根據閉包類型在整體定義中的位置為閉包類型生成(損壞的)名稱(如評論中所述,通過對它們進行計數)。 標准中這種方法起作用的原因有些微妙。

[basic.def.odr]/13.10 沒有指定閉包類型相同; 它使用“應”,因此要求它們相同(如下所示,僅在更微妙的情況下才有效果)。 /14 具有這種效果:“行為就好像有一個具有單一定義的單一實體”,這必然會產生單一的閉包類型。 即便如此,說 lambda 表達式“產生相同的閉包類型”也是不恰當的:相反,只有一種產生的閉包類型與整個程序相關。

請注意,如果沒有這樣的規定,像這樣的簡單功能

#ifndef MY_HEADER_HH
#define MY_HEADER_HH

inline auto make_assign(int i) {return [i](int &x) {x=i;};}

#endif

如果多個翻譯單元試圖將各種make_assign(…)對象添加到std::vector<decltype(make_assign(0))> ,則將不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM