使用lambda中捕获的常量值作为模板参数合法吗
Is it legal to use a const value captured in a lambda as a template argument?
考虑一下同事提供的以下代码:
#include <array>
#include <string>
int main() {
const int size = 4;
return [size]() {
std::array<std::string, size> a; // *
return a.size();
}();
}
Clang 5.0.0接受了它,但GCC 7.2拒绝了它,星型线的错误消息是:
error: '__closure' is not a constant expression
哪个编译器是对的?
规则实际上是直观的:任何不需要捕获的变量都会引用原始变量。[expr.prim.lambda]/11:
lambda表达式是复制捕获的实体的odr使用转换为对的相应未命名数据成员的访问闭合类型。[注意:不是odr使用的id表达式引用原始实体,而不是闭包类型的成员。[…]--尾注]
很明显,声明的size
变量可以在常量表达式中使用,因此Clang是对的。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何将lambda作为模板类的成员函数参数
- 使用自动推导的 lambda 参数作为常量表达式
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 将__device__ lambda 作为参数传递给 __global__ 函数
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- Lambda可以用作非类型模板参数吗
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 如何确定捕获不可复制参数的 lambda 的类型?
- 省略C++可变参数 lambda 中的"auto"关键字?
- 如何访问可变参数 lambda 函数参数
- 可变参数 lambda 捕获的解决方法
- 传递给多个参数 lambda 表达式的参数
- 如何编写丢弃其参数的通用可变参数 lambda
- 使用c++参数lambda函数
- 将函数模板"pass"为泛型可变参数 lambda 返回语句是好方法吗?
- c++模板非类型参数lambda函数