以下程序使用Clang和GCC的主干版本进行编译:
#include <type_traits>
auto main() -> int
{
auto x = 42;
[&x] { static_assert(std::is_same<decltype(x), int>::value, "!"); };
}
然而,静态断言失败了VC12和VC14,decltype(x)
评估为int&
而不是int
。
我可以看到为什么会发生这种情况:编译器生成的lambda闭包类型有一个引用类型的数据成员,在构造时绑定到x
。 decltype(x)
然后引用此数据成员并作为结果提供int&
。
x
直接指向捕获的变量。
C ++标准的第[expr.prim.lambda]/18段说:
[...]未指明是否在闭包类型中为通过引用捕获的实体声明了其他未命名的非静态数据成员。
这似乎暗示行为是实现定义的,但我发现更可能的是我在这里遗漏了一些东西。应该是什么样的正确行为以及标准要求它在哪里?