相关疑难解决方法(0)

为什么 Visual C++(最新)和 gcc 12.1 接受隐藏 lambda 的 init 捕获,而 clang 14.0.0 不接受?(c++20)

情况1

int main() {
    int x = 100;
    auto lamb_var = [y = x](){
                    int y = 10;
                    return y + 1;
    }; 

    assert (lamb_var() == 11);

    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/hPPParjnz

MSVC 和 GCC 都接受隐藏 init-capture,而 Clang 则指责复合语句上的 y 重新定义并引发编译器错误。

但是,如果我们删除 init-capture 并进行 simple-capture,则所有编译器都接受 Shadowing:

案例2

int main() {
    int x = 100;
    auto lamb_var = [x](){
                    int x = 10;
                    return x + 1;
    }; 

    assert (lamb_var() == 11);

    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/Gs4cadf5e


简单捕获(情况 2)会导致在 …

c++ lambda compiler-errors language-lawyer

6
推荐指数
1
解决办法
147
查看次数

标签 统计

c++ ×1

compiler-errors ×1

lambda ×1

language-lawyer ×1