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

Her*_*ort 5 c++ lambda c++11

这对我来说是一个很奇怪的错误.检查以下代码:

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

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

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

编译器说明是:

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

但该方法没有标记const**.
好吧,我没有使用任何const参数,我无法弄清楚编译器试图告诉我什么.有人能帮助我吗?

Ker*_* SB 10

const默认情况下,Lambda调用操作员成员函数.如果你想要一个可变调用运算符,请说mutable:

auto fn = [=]() mutable {
//              ^^^^^^^
    v.push_back("world");
};
Run Code Online (Sandbox Code Playgroud)

const是默认的力量,你要明确的事实,你的意思是捕捉复制的载体和变异那个副本,而不是原来的载体v.

相比之下,通过引用捕获的变量可以通过const限定的成员函数进行变更:

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

(这主要是因为const T它与Twhen 相同T = U &;在C++中没有"常量引用".)

  • @NathanOliver:不是"同样",而是"相反". (3认同)