函数式转换符号 T(x) 和 static_cast<T>(x) 之间的区别
Difference between functional cast notation T(x) and static_cast<T>(x)
(我知道这与此处的其他一些问题非常相似,但我还没有找到任何具体的语言律师回答这个精确的细节。大部分几乎重复的人只是在询问他们是否应该使用 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{}
之间的细微差别。)
单个参数的函数式转换符号 T(x)
由标准定义为与 C 风格转换符号 (T)x
相同。 C 风格的强制转换符号可以进行 static_cast
可以进行的任何转换,以及其他(可能不需要),例如丢弃常量。因此,例如 convert1
可用于将 int const*
转换为 int*
,而 convert2
则不能。
(我知道这与此处的其他一些问题非常相似,但我还没有找到任何具体的语言律师回答这个精确的细节。大部分几乎重复的人只是在询问他们是否应该使用 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{}
之间的细微差别。)
单个参数的函数式转换符号 T(x)
由标准定义为与 C 风格转换符号 (T)x
相同。 C 风格的强制转换符号可以进行 static_cast
可以进行的任何转换,以及其他(可能不需要),例如丢弃常量。因此,例如 convert1
可用于将 int const*
转换为 int*
,而 convert2
则不能。