Lambda:使用已删除的赋值运算符捕获"this"会发出编译器警告



我将我的项目设置为将编译器警告视为错误,而这个看似微不足道的lambda捕获被证明是我一个令人头疼的问题:

#pragma warning(default : 4626)
struct B{
B& operator=(const B&) = delete;
void f(){
auto l = [this](){ // <== compiler warning
/*body*/
};
}
};
int main(){
return 0;
}

上面的代码在 MSVC 2019 (16.2.5( 中生成以下警告:

警告 C4626:"B::f::":赋值运算符隐式定义为已删除

针对捕获this的 lambda 发出警告(如果我没有捕获this它会编译时没有警告(。

有人可以向我解释警告的原因,以及是否有办法编写代码以使其干净地编译?

我知道 lambda 的赋值运算符被隐式删除,但不确定(如果(与我收到的警告有何关系。

IAM 处于类似情况并重现了如下警告:

#pragma warning(default : 4626)
struct A
{
A& operator=(const A&) = delete;
};
struct B : public A
{
//B& operator=(const B&) = delete;
void f(){
auto l = [](){ // <== compiler warning
/*body*/
};
}
};
int main(){
return 0;
}

使用/std:c++latest /W4编译 就我而言,您是否捕获此内容没有区别。

您是否从另一个具有已删除运算符= 的类继承? 在我的情况下,我通过显式删除运算符=来避免该警告。 此警告发生在使用/latest 编译的 MVS 19 16.3.0 中。对于/std:C++17,没有这样的警告。

编辑

一旦使用了 Lamdba 中捕获的内容(由 Copy 或 ref 捕获无关紧要(,也会发生此警告:

#pragma warning(default : 4626)
int main()
{
int foo;
auto bar = [&]() {
foo;
};
return 0;
}
<source>(8): warning C4626: 'main::<lambda_1>': assignment operator was implicitly defined as deleted

(使用/std:c++latest/W4(

相关内容

  • 没有找到相关文章

最新更新