这对我来说是一个很奇怪的错误.检查以下代码:
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
它与T
when 相同T = U &
;在C++中没有"常量引用".)
归档时间: |
|
查看次数: |
554 次 |
最近记录: |