C++ 将lambda中捕获的常量值用作模板参数是否合法?
考虑由同事提供的以下代码:C++ 将lambda中捕获的常量值用作模板参数是否合法?,c++,templates,lambda,language-lawyer,C++,Templates,Lambda,Language Lawyer,考虑由同事提供的以下代码: #include <array> #include <string> int main() { const int size = 4; return [size]() { std::array<std::string, size> a; // * return a.size(); }(); } 哪个编译器是正确的?规则实际上是直观的:任何不需要捕获的变量都会引用原始变量: 函数的复
#include <array>
#include <string>
int main() {
const int size = 4;
return [size]() {
std::array<std::string, size> a; // *
return a.size();
}();
}
哪个编译器是正确的?规则实际上是直观的:任何不需要捕获的变量都会引用原始变量: 函数的复合语句中的每个id表达式 lambda表达式是复制捕获的实体的odr用法 转换为对成员的相应未命名数据的访问 闭包类型。[ 注意:不是odr使用的id表达式 引用原始实体,而不是闭包类型的成员。 […] — 尾注 ]
显然,声明的
size
变量可以在常量表达式中使用,因此Clang是正确的。它使用编译。我本以为不应该编译,但闭包在一个难题中是一个谜。如果我理解正确,CV限定符遵循副本捕获。因此,Clang是正确的。
error: '__closure' is not a constant expression