在尝试回复another question时,我发现GCC和clang如何与lambdas合作。
请考虑以下代码:
#include <type_traits>
int main() {
int i = 0;
[j = i](){ static_assert(std::is_same<decltype(j), const int>::value, "!"); }();
}
在这种情况下,铿锵rejects the snippet,而GCC accepts the code。
另一方面,他们都接受下面的代码(出于显而易见的原因):
#include <type_traits>
int main() {
int i = 0;
[j = i]()mutable{ static_assert(std::is_same<decltype(j), int>::value, "!"); }();
}
编译器是否允许将副本捕获的变量声明为不可变lambdas的const?
答案 0 :(得分:3)
mutable
在这里无关紧要。
在[expr.prim.lambda]中:
init-capture 的行为就像它声明并显式捕获“
形式的变量一样auto
init-capture;”
来自[dcl.type.simple]:
对于表达式
e
,由decltype(e)
表示的类型定义如下:[...]如果e
是未加密码的 id-expression 或者是一个未加括号的类成员访问(5.2.5),decltype(e)
是e
命名的实体的类型。
因此decltype(j)
应为int
。这是一个gcc错误,报告为79378。