(我知道这与其他一些问题非常类似,但我还没有找到任何具体的,语言 - 律师的,回答这个精确的细节。重复只是问他们是否应该使用static_cast
而不是功能风格的演员表(答案:是),或static_cast
和 C风格的演员之间的区别。)
在C ++中,以下两个强制转换似乎非常相似:
template<class T, class U> auto convert1(U&& u) {
return T( std::forward<U>(u) );
}
template<class T, class U> auto convert2(U&& u) {
return static_cast<T>( std::forward<U>(u) );
}
对于任何类型T
,U
,是否存在任何差异;或者它们100%完全相同?
如果它们不同,我会欣赏标准库中与细微差别相关的一些地方的例子。 (我的意思是如何指定std::make_shared<T>(args...)
如何使用T(args...)
而不是T{args...}
构建其对象,因为T()
和T{}
之间存在细微差别。)< / p>
答案 0 :(得分:4)
单个参数的函数式强制转换符号T(x)
由标准定义为与C样式强制转换符号(T)x
相同。 C样式的强制转换符号可以执行static_cast
可以执行的任何转换,以及其他(可能不需要的)转换,例如转换constness。例如,convert1
可用于将int const*
转换为int*
而convert2
则无法转换为{{1}}。