在“有效的现代C++”第32项第227-228页中,Scott介绍了下面的代码,以解决C++11中缺乏generalized lambda captures的问题。
// data is in scope
auto func =
std::bind(
[](const std::vector<double>& x) // I've renamed it x so there's no ambiguity in my description below
{ /* usses of x */ },
std::move(data)
);然后他做了以下的评论,我不完全理解。
默认情况下,从lambda生成的闭包类中的
成员函数是
const。这样做的效果是在lambda的主体中呈现闭包const中的所有数据成员。但是,绑定对象中移动构造的data副本不是const,因此为了防止在lambda中修改data副本,lambda的参数被声明为对-const的引用。如果lambda被声明为mutable,那么它的闭包类中的operator()将不会被声明为const,在lambda的参数声明中省略const是合适的:
// data在作用域自动func = std::bind( std::vector& x可变//同上{x */ }的/*用法,std::move(data) );
我试着打破它:
mutable) lambda闭包具有operator()成员函数const,(然而,lambda一开始并没有捕捉到任何东西,因此以下几点似乎与我无关.)
在
std::bind object;const成员变量中复制(好的,移动) data,lambda通过引用(而不是通过值)接受参数(因为其全部目的是模拟C++14的move lambda捕获),程序员可以通过nounintentional);x修改data (这可以避免这一点,参数是const&.)。
所以,如果兰博达被宣布了,我不明白最后一段时间的意义.
发布于 2020-05-15 18:45:41
好的,写这个问题让我明白,我只是忽略了代码的最初动机:模拟一个通用的lambda捕获。
也许Scott还暗示,代码的编写人员期望bind对象func与存储在func中的实际lambda具有相同的说明符时,其行为与所需的lambda类似,这是很自然的(实际上,文本只引用了mutable说明符,可能是因为它是唯一值得讨论的)。
换句话说,
看到通过func;
func中的非mutable lambda,程序员很可能期望func将作为对应的非mutable C++14 lambda运行,因此实际lambda参数的const是mutable,那么用户希望func以相应的mutable C++14λ的形式运行,因此他不期望它未经修改就保留捕获的值,因此在第二块代码中缺少d17。H 218F 219代码>F 219代码。甚至更短:
存储在mutable中的非mutable lambda不应该修改其参数,因为相应的非mutable C++14 lambda不会修改其捕获的变量。
https://stackoverflow.com/questions/61826276
复制相似问题