static_cast<T> 是什么?对 T& 做些什么?
所以我问了这个问题,我想通过static_cast
解决它.(顺便说一句,它确实解决了问题,我只是不确定我是否理解原因.)
So I asked this question and I was tinkering around with solving it via static_cast
. (Incidentally it does solve the problem, I'm just not sure if I understand why.)
在代码中:
vector<int> foo = {0, 42, 0, 42, 0, 42};
replace(begin(foo), end(foo), static_cast<int>(foo.front()), 13);
static_cast
是否只是构造了一个 R 值 int
?那和只是调用有什么区别:
Is the static_cast
simply constructing an R-Value int
? What's the difference between that and just the call:
replace(begin(foo), end(foo), int{foo.front()}, 13);
根据答案 static_cast
确实 似乎构造了一个 R 值 int
:http://ideone.com/dVPIhD
As inferred by the answers static_cast
does seem to construct an R-Value int
: http://ideone.com/dVPIhD
但是这段代码不能在 Visual Studio 2015 上运行.这是编译器错误吗?在这里测试:http://webcompiler.cloudapp.net/
But this code does not work on Visual Studio 2015. Is this a compiler bug? Test here: http://webcompiler.cloudapp.net/
推荐答案
是的,它与
int{...}
相同,除非.front()
返回一个需要缩小转换的类型.在这种情况下,int(...)
将是相同的.
Yes, it is the same as
int{...}
, unless.front()
returned a type that required a narrowing conversion. In that case,int(...)
would be identical.
在程序员错误的情况下,静态转换不太可能做一些危险的事情,比如将指针转换为 int 而不是 int(...)
.
In the case of programmer error, static cast is marginally less likely to do something dangerous, like convert a pointer into an int than int(...)
.
注意消除强制转换会导致未定义的行为,因为替换操作修改了前面的元素,这可能会破坏 std::replace
.
Note eliminating the cast results in undefined behaviour as the front element is modified by the replace operation, and that could break std::replace
.
我会用
template<class T>
std::decay_t<T> copy_of(T&& t){return std::forward<T>(t); }
我在这里.
至于为什么这在 MSVC 中不起作用...
As for why this isn't working in MSVC...
MSVC 可以帮助您处理将 T
类型的变量转换为 T
并且什么都不做的情况.这会破坏您的代码.
MSVC helpfully takes situations where you cast a variable of type T
to a T
and proceeds to do nothing. This breaks your code.
有一个编译器标志 (/Zc:rvalueCast) 你可以用来让 MSVC 不再破坏你的代码.
There is a compiler flag (/Zc:rvalueCast) you can use to make MSVC no longer break your code.
相关文章