Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将lambda中捕获的常量值用作模板参数是否合法?_C++_Templates_Lambda_Language Lawyer - Fatal编程技术网

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