如果非捕获的局部变量存在,为什么不能在Lambda中使用不合格的成员变量?

ima*_*ett 7 c++ lambda shadowing language-lawyer

简单的例子:

class Foo {
    int x;

    void bar(int x) {
        [this]() -> void {
            x = 6;
        }();
    }
};
Run Code Online (Sandbox Code Playgroud)

这不能在GCC,Clang,MVC或ICC上编译(请参见实时).如果我换void bar(int x)了void bar(int y),或者如果我换x = 6;到this->x = 6;那么它工作正常.

这对我来说没有意义.x来自调用的局部变量bar故意不在lambda中捕获.唯一x有意义的是Foo成员变量.

问题:这是预期的行为,如果是这样,请解释原因?

Dar*_*nus 0

你得到的错误说:

错误:在未指定捕获默认值的情况下,无法在 lambda 中隐式捕获变量“x”

x = 6;

注意:'x'在此声明 void bar(int x) { ^ 注意:lambda 表达式从这里开始 this -> void { ^ 警告:私有字段 'x' 未使用 [-Wunused-private-field] int x;

这让我意识到问题出在变量的定义(或更准确地说,重新定义x)上。您在外部声明它bar()并作为参数声明它。以下代码已编译给我(使用您展示的实时工具):

class Foo {
    int x;

    void bar() {
        [this]() -> void {
            x = 6;
        }();
    }
};
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。