Jon*_*Mee 7 c++ casting reference rvalue static-cast
所以我问了这个问题,我正在修补它通过解决它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/
是的,int{...}除非.front()返回需要缩小转换的类型,否则它是相同的.在那种情况下,int(...)将是相同的.
在程序员错误的情况下,静态转换稍微不太可能做一些危险的事情,比如将指针转换为int而不是int(...).
注意取消强制转换会导致未定义的行为,因为前面的元素被替换操作修改,并且可能会中断std::replace.
我会用
template<class T>
std::decay_t<T> copy_of(T&& t){return std::forward<T>(t); }
Run Code Online (Sandbox Code Playgroud)
我在这里.
至于为什么这不适用于MSVC ......
MSVC可以帮助您将类型变量转换T为a T并继续执行任何操作.这会打破你的代码.
有一个编译器标志(/ Zc:rvalueCast)可用于使MSVC不再破坏您的代码.
成员函数front返回对非空向量的第一个元素的引用.
另一方面,标准算法replace声明为
template <class ForwardIterator, class T>
void replace (ForwardIterator first, ForwardIterator last,
const T& old_value, const T& new_value)
Run Code Online (Sandbox Code Playgroud)
通过引用获取第三个参数.因此,通常可以通过算法改变矢量的第一元素,并且因此算法对矢量的其他元素的处理可能是不正确的.
使用static_cast创建一个临时对象,并且算法不会更改它.因此,向量的所有元素的处理都是正确的.
至于我,那么我建议auto在这种情况下使用关键字的C++提议.例如
replace(begin(foo), end(foo), auto( foo.front() ), 13);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |