Clang编译错误:"变量'数组'在lambda表达式中无法捕获具有可变修改类型的变量

时间:2017-08-24 21:29:04

标签: c++11 lambda g++ clang

在下面列出的代码中," LambdaTest"仅在Clang上出现以下错误:

shared/LambdaTest.cpp:8:31: error: variable 'array' with variably 
modified type cannot be captured in a lambda expression
    auto myLambdaFunction = [&array]()
                          ^
shared/LambdaTest.cpp:7:9: note: 'array' declared here
    int array[length];

功能" LambdaTest2"它将数组作为参数传递,而不是在G ++ / Clang上捕获编译。

// Compiles with G++ but fails in Clang
void LambdaTest(int length)
{
    int array[length];
    auto myLambdaFunction = [&array]()
    {
        array[0] = 2;
    };
    myLambdaFunction();
}

// Compiles OK with G++ and Clang
void LambdaTest2(int length)
{
    int array[length];
    auto myLambdaFunction = [](int* myarray)
    {
        myarray[0] = 2;
    };
    myLambdaFunction(array);
}

两个问题:

  1. 编译器错误消息"变量'数组'具有可变修改类型的不能在lambda表达式中捕获"意思?

  2. 为什么LambdaTest无法在Clang而不是G ++上编译?

  3. 提前致谢。

    编译器版本:
       * G ++版本4.6.3
       * clang版本3.5.0.210790

3 个答案:

答案 0 :(得分:1)

标准C ++中不允许使用

int array[length];。必须在编译时知道数组的维度。

您所看到的是非标准功能的典型特征:它们在某些时候与标准功能相冲突。这不是标准的原因是因为没有人能够提出解决这些冲突的令人满意的提案。相反,每个编译器都做了自己的事情。

您必须停止使用非标准功能,或者与编译器碰巧使用它一起使用。

答案 1 :(得分:1)

C ++中没有正式支持VLA(可变长度数组) 您可以改为使用std::vector

void LambdaTest(int length)
{
    std::vector<int> array(length);
    auto myLambdaFunction = [&array]()
    {
        array[0] = 2;
    };
    myLambdaFunction();
}

答案 2 :(得分:0)

感谢上面的两个答案,指出VGA是非标准的。现在我知道要搜索什么。

以下是与该主题相关的更多链接。

Why aren't variable-length arrays part of the C++ standard?

Why no VLAS in C++