不可变的 lambda 函数:复制捕获的变量是否允许是 const
Non mutable lambda function: are copy-captured variables allowed to be const?
在尝试回答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。
相关文章:
- 是否应该在模板化代码中完全避免const
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 知道模板参数在编译时是否为 const char*?
- "this"指向的对象是否与 const 对象相同?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 如何检查函数是否真的获得了定义为 const 的变量?
- 修改数据是否由 const shared_ptr&Ok 传递?
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 将shared_ptr转换为<T> shared_ptr<const T>是否会更改它所指向的对象?
- 是否可以按模板类型更改静态 const 类成员的值
- 是否可以翻新(TR)QSTRING CONST
- 如何避免重复的const和非const虚拟函数?是否可以
- 添加C++前缀是否"const"硬件级别执行任何不同操作,或者只是对编码人员的保护?