【问题标题】:Difference between functional cast notation T(x) and static_cast<T>(x) [duplicate]功能转换符号 T(x) 和 static_cast<T>(x) 之间的区别 [重复]
【发布时间】:2018-01-22 17:20:13
【问题描述】:

(我知道这与此处的其他一些问题非常相似,但我还没有找到任何具体的问题,语言律师,回答 这个精确的细节。大多数近乎重复的问题是只是询问他们是否应该使用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% 相同?

如果它们不同,我会很感激标准库中一些与细微差别相关的地方的示例。 (我的意思是,由于T()T{} 之间存在细微差别,我的意思是如何指定std::make_shared&lt;T&gt;(args...) 以使用T(args...) 而不是T{args...} 构造其对象。)

【问题讨论】:

  • P.S.:无需评论 T(u,v) 有效而 static_cast&lt;T&gt;(u,v) 无效。我只问一个论点u。 :)
  • 从技术上讲,T(std::forward(u)) 是对构造函数的调用,而不是强制转换。
  • @Justin:至少投票最多的答案提到了函数式转换,但不幸的是它没有说明它们的语义;它只是说“它们存在”并继续前进。那边的提问者不关心函数式的演员表。
  • @Quuxplusone “那边的提问者不关心函数式的演员表。”错误的。你甚至读过那个问题吗?在项目符号列表中是 C 样式转换函数样式转换
  • @Quuxplusone 和 只是路过并发布了一条带有相关链接的评论,我认为您可能会喜欢阅读 :)

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


【解决方案1】:

标准将单个参数的函数式转换表示法T(x) 定义为与C 式转换表示法(T)x 相同。 C 风格的强制转换表示法可以进行 static_cast 可以进行的任何转换,以及其他(可能是不希望的)转换,例如丢弃 constness。例如,convert1 可以用于将int const* 转换为int*,而convert2 则不能。

【讨论】:

  • 啊,是的。 [expr.type.conv] “如果初始化器是带括号的单个表达式,则类型转换表达式等效于(在定义上,如果在含义上定义)对应的强制转换表达式。”这似乎很确定。谢谢!
  • "and others" 还包括reinterpret_cast,这肯定是不希望的
  • 我以前没有意识到这一点。这太可怕了。我现在担心我曾经以auto x = Y(z) 形式编写的任何构造函数都是定时炸弹。
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2017-11-29
  • 2015-11-06
  • 2013-06-14
相关资源
最近更新 更多