功能强制转换符号T(x)和static_cast <t>(x)

时间:2017-08-14 19:35:34

标签: c++ language-lawyer static-cast

(我知道这与其他一些问题非常类似,但我还没有找到任何具体的,语言 - 律师的,回答这个精确的细节。重复只是问他们是否应该使用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) );
}

对于任何类型TU,是否存在任何差异;或者它们100%完全相同?

如果它们不同,我会欣赏标准库中与细微差别相关的一些地方的例子。 (我的意思是如何指定std::make_shared<T>(args...)如何使用T(args...)而不是T{args...}构建其对象,因为T()T{}之间存在细微差别。)< / p>

1 个答案:

答案 0 :(得分:4)

单个参数的函数式强制转换符号T(x)由标准定义为与C样式强制转换符号(T)x相同。 C样式的强制转换符号可以执行static_cast可以执行的任何转换,以及其他(可能不需要的)转换,例如转换constness。例如,convert1可用于将int const*转换为int*convert2则无法转换为{{1}}。