"C++编程语言[第4版] - Bjarne Stroustrup"中的绑定错误

Eve*_*ekk 14 c++ bind c++11

我在Bjarne Stroustrup的书中找到了这段代码: 页面截图

这段代码的问题是变量i不会保持在2,它会增加到3.你可以在这里查看:https://wandbox.org/permlink/p5JC1nOA4pIpsgXb

我们不必使用它std::ref()来增加此变量.这是书中的错误还是自C++ 11以来发生过一些变化?

Pra*_*ian 10

这个例子是不正确的,bind它会复制它的参数,除非你把它包装进去,std::reference_wrapper正如文本正确地说的那样,但这不是示例所示的内容.在示例中,参数i传递给返回的仿函数bind,而不是传递给bind它自己.如果这个例子是以下,i那么遗嘱的价值就会保留下来2.

auto inc = bind(incr, i);   // a copy of i is made
inc(); // i stays 2; inc(i) incremented a local copy of i
Run Code Online (Sandbox Code Playgroud)

在本书所示的示例中,参数i将被转发到incr,这将导致对i传递给函数的原始的左值引用,并且原始i将递增.

有关标准报价,请参见23.14.11.3 [func.bind.bind]/10

的绑定参数值v1,v2,...,vN其对应的类型和V1,V2......,VN取决于类型TDi从调用导出bind和CV-预选赛品种的调用包装的g如下:
......
-如果该值jis_­placeholder_­v<TDi>不零,参数是std?::?forward<Uj>(uj),它的类型ViUj&&;