为什么c ++ 11要求我们编写:
[a,b]() mutable { a=7; } // b is needlessly mutable, potential source of bugs
Run Code Online (Sandbox Code Playgroud)
代替:
[mutable a,b]() { a=7; } // no problems here
Run Code Online (Sandbox Code Playgroud)
这是一种疏忽,被认为不够重要,还是有特定的技术原因?
Jes*_*ood 18
在n2651中提到了你的建议:
可以扩展lambda表达式的语法,以允许声明闭包成员是否应该声明为可变.
这种方法可能会让程序员感到困惑,因为可变性不是闭包对象的属性,而是存储在闭包中的变量.
我不知道这是否是唯一的原因,但它似乎确实被考虑了.然而,在Herb Sutter的提议中,他建议删除mutable而不是隐含地制作捕获副本const,因此我们可能会再次看到更改.
可能是一种疏忽(与rvalue refs不能使用的方式相同),以及lambda在概念上实现的方式的工件.
int a;
int* b;
float c;
auto lambda1 = [&a, b, c](int d) mutable -> void {};
class lambda1 {
public:
void operator()(int d) {}
private:
int& a_;
int* b_;
float c_;
};
auto lambda2 = [&a, b, c](int d) -> void {};
class lambda2 {
public:
void operator()(int d) const {}
private:
int& a_;
int* b_;
float c_;
};
Run Code Online (Sandbox Code Playgroud)
该mutable关键字适用于lambda表达式生成的对象,而不是单独捕获的项目,因此编译器可以使用标准的第5.1.2节第5段中描述const的operator()方法使用修饰符来实现.
当且仅当lambdaexpression的parameter-declaration-clause后面没有mutable时,此函数调用运算符才被声明为const(9.3.1).
在您的示例中,lambda表达式生成的类可能如下所示:
class lambda
{
int a, b;
public:
lambda( int a, int b ) : a( a ), b( b ) {}
void operator()() // non-const due to mutable keyword
{
a = 7;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3516 次 |
| 最近记录: |