我将我的项目设置为将编译器警告视为错误,而这个看似微不足道的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(