不可变的 lambda 函数:复制捕获的变量是否允许是 const

Non mutable lambda function: are copy-captured variables allowed to be const?

本文关键字:是否 const 变量 函数 lambda 复制 不可变      更新时间:2023-10-16

在尝试回答SO上的另一个问题时,我发现GCC和clang与lambdas的工作方式有所不同。

请考虑以下代码:

#include <type_traits>
int main() {
    int i = 0;
    [j = i](){ static_assert(std::is_same<decltype(j), const int>::value, "!"); }();
}

在这种情况下,clang 拒绝代码段,而 GCC 接受代码。

另一方面,他们都接受下面的代码(出于显而易见的原因(:

#include <type_traits>
int main() {
    int i = 0;
    [j = i]()mutable{ static_assert(std::is_same<decltype(j), int>::value, "!"); }();
}

编译器是否允许将复制捕获的变量声明为不可变 lambda 的 const?

mutable在这里无关紧要。

在 [expr.prim.lambda] 中:

初始化捕获的行为

就像它声明并显式捕获形式为" auto init-capture;"的变量

一样。

从[dcl.type.simple]:

对于表达式e,用decltype(e)表示的类型定义如下:[...]如果e是无括号的id表达式或无括号的类成员访问(5.2.5(,则decltype(e)是由e命名的实体的类型。

所以decltype(j)应该int.这是一个 gcc 错误,报告为 79378。

相关文章: