lambda表达式中没有匹配的成员函数错误

No matching member function error inside lambda expression?

本文关键字:成员 函数 错误 表达式 lambda      更新时间:2023-10-16

这对我来说是一个非常奇怪的错误。检查下面的代码:

void test(void){
    vector<string> v;
    v.push_back("hello");
    auto fn=[=](){
        v.push_back("world");
    };
}

第一个push_back方法通过了编译,但第二个方法失败,产生错误:

错误:调用"push_back"没有匹配的成员函数

编译器注释为:

**注意:(687,36)候选函数不可行:"this"参数的类型为"const vector"(又名"const vector,allocater>>")

但该方法未标记为const**
我没有使用任何const参数,我不知道编译器想告诉我什么。有人能帮我吗?

默认情况下,Lambda调用运算符成员函数为const。如果你想要一个可变的呼叫操作员,比如mutable:
auto fn = [=]() mutable {
//              ^^^^^^^
    v.push_back("world");
};

const设为默认值会迫使您明确表示要捕获向量的副本并对该副本进行变异,而不是原始向量v

相反,通过引用捕获的变量可以通过const限定的成员函数进行突变:

auto fn = [&]() {
//        ^^^
    v.push_back("world");  // modifies original "V"!
};

(这主要是因为const TT = U &时的T相同;C++中没有"常量引用"。)

捕获值为const使用关键字mutable(不改变原始矢量):

auto fn = [=]() mutable {
    v.push_back("world");
};

或通过参考(改变原始矢量):

auto fn = [&]() {
    v.push_back("world");
};

由于C++14标记,为了完整性,我还引用初始值设定项列表作为替代解决方案:

[&vec = v](){ vec.push_back("world") };

如果您想通过复制而不是通过引用捕获:

[vec = v]() mutable { vec.push_back("world") };

初始化器列表作为(让我说)捕获方法C++14开始可用,如前所述。