相关疑难解决方法(0)

按值传递参考参数

考虑这个简单的程序:

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为我们提供了各种类型的工具,我可以简单地将这个值强制转换为非引用类型并传递内联,而不创建临时的吗?

c++ reference pass-by-reference pass-by-value c++11

12
推荐指数
2
解决办法
549
查看次数

static_cast <T>对T&做了什么?

所以我问了这个问题,我正在修补它通过解决它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/

c++ casting reference rvalue static-cast

7
推荐指数
2
解决办法
634
查看次数