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

And*_*owl 7 c++ lambda reference decltype language-lawyer

以下程序编译Clang和GCC的主干版本:

#include <type_traits>

auto main() -> int
{
    auto x = 42;
    [&x] { static_assert(std::is_same<decltype(x), int>::value, "!"); };
}
Run Code Online (Sandbox Code Playgroud)

但是,静态断言与VC12和VC14失败,其中decltype(x)评估为int&而不是int.

我可以看到为什么会发生这种情况:lambda的编译器生成的闭包类型有一个引用类型的数据成员,它x在构造时绑定.decltype(x)然后引用此数据成员并int&作为结果给出.

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

C++标准的段落[expr.prim.lambda]/18表示:

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

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