函数式转换符号 T(x) 和 static_cast<T>(x) 之间的区别

Difference between functional cast notation T(x) and static_cast<T>(x)

(我知道这与此处的其他一些问题非常相似,但我还没有找到任何具体的语言律师回答这个精确的细节。大部分几乎重复的人只是在询问他们是否应该使用 static_cast 而不是函数式转换(答案:是),或者 static_castC 风格 之间的区别演员表。)

在 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{} 之间的细微差别。)

单个参数的函数式转换符号 T(x) 由标准定义为与 C 风格转换符号 (T)x 相同。 C 风格的强制转换符号可以进行 static_cast 可以进行的任何转换,以及其他(可能不需要),例如丢弃常量。因此,例如 convert1 可用于将 int const* 转换为 int*,而 convert2 则不能。