什么是lambda中的decltype(x),当x被引用捕获时应返回?

时间:2016-11-10 07:49:33

标签: c++ lambda reference language-lawyer decltype

以下程序使用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闭包类型有一个引用类型的数据成员,在构造时绑定到xdecltype(x)然后引用此数据成员并作为结果提供int&

另一方面,Clang和GCC似乎表现得好像没有生成数据成员, id-expression x直接指向捕获的变量。

C ++标准的第[expr.prim.lambda]/18段说:

  

[...]未指明是否在闭包类型中为通过引用捕获的实体声明了其他未命名的非静态数据成员。

这似乎暗示行为是实现定义的,但我发现更可能的是我在这里遗漏了一些东西。应该是什么样的正确行为以及标准要求它在哪里?

0 个答案:

没有答案