【发布时间】:2018-01-22 17:20:13
【问题描述】:
(我知道这与此处的其他一些问题非常相似,但我还没有找到任何具体的问题,语言律师,回答 这个精确的细节。大多数近乎重复的问题是只是询问他们是否应该使用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% 相同?
如果它们不同,我会很感激标准库中一些与细微差别相关的地方的示例。 (我的意思是,由于T() 和T{} 之间存在细微差别,我的意思是如何指定std::make_shared<T>(args...) 以使用T(args...) 而不是T{args...} 构造其对象。)
【问题讨论】:
-
P.S.:无需评论
T(u,v)有效而static_cast<T>(u,v)无效。我只问一个论点u。 :) -
从技术上讲,T(std::forward(u)) 是对构造函数的调用,而不是强制转换。
-
@Justin:至少投票最多的答案提到了函数式转换,但不幸的是它没有说明它们的语义;它只是说“它们存在”并继续前进。那边的提问者不关心函数式的演员表。
-
@Quuxplusone “那边的提问者不关心函数式的演员表。”错误的。你甚至读过那个问题吗?在项目符号列表中是 C 样式转换和函数样式转换
-
@Quuxplusone 和 我 只是路过并发布了一条带有相关链接的评论,我认为您可能会喜欢阅读 :)
标签: c++ language-lawyer static-cast