考虑这个简单的程序:
vector<int> foo = {0, 42, 0, 42, 0, 42};
replace(begin(foo), end(foo), foo.front(), 13);
for(const auto& i : foo) cout << i << '\t';
Run Code Online (Sandbox Code Playgroud)
当我写它时我希望得到:
13 42 13 42 13 42
但相反,我得到了:
13 42 0 42 0 42
问题当然是replace通过引用获取最后2个参数.因此,如果它们中的任何一个碰巧处于正在操作的范围内,结果可能是意外的.我可以通过添加临时变量来解决这个问题:
vector<int> foo = {0, 42, 0, 42, 0, 42};
const auto temp = foo.front();
replace(begin(foo), end(foo), temp, 13);
for(const auto& i : foo) cout << i << '\t';
Run Code Online (Sandbox Code Playgroud)
我知道C++ 11为我们提供了各种类型的工具,我可以简单地将这个值强制转换为非引用类型并传递内联,而不创建临时的吗?
所以我问了这个问题,我正在修补它通过解决它static_cast.(顺便提一下,它确实解决了问题,我只是不确定我是否理解为什么.)
在代码中:
vector<int> foo = {0, 42, 0, 42, 0, 42};
replace(begin(foo), end(foo), static_cast<int>(foo.front()), 13);
Run Code Online (Sandbox Code Playgroud)
是static_cast简单地构建一个R值int?它和电话之间有什么区别:
replace(begin(foo), end(foo), int{foo.front()}, 13);
Run Code Online (Sandbox Code Playgroud)
编辑:
作为推断的答案static_cast 也似乎构成一个R值int:http://ideone.com/dVPIhD
但是这个代码不不上的Visual Studio 2015年工作,这是一个编译器错误?在这里测试:http://webcompiler.cloudapp.net/