非可变lambda函数:复制捕获变量是否允许为常量?

时间:2017-02-04 21:50:37

标签: c++ c++11 lambda language-lawyer

在尝试回复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?

1 个答案:

答案 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