【问题标题】:What are the names of type(myVar) and (type)myVar? Are they both bad practice?type(myVar) 和 (type)myVar 的名称是什么?他们都是不好的做法吗?
【发布时间】:2014-02-17 23:39:29
【问题描述】:

几乎是What's the difference between function(myVar) and (function)myVar?的重演

但我想知道:

这些变体的名称是什么?它们是“坏”的吗?

type(myVar) 是类似于语法的构造函数,但对于基本类型,它是否与执行在 C++ 中被认为不好的 C 样式转换相同?

(type)myVar 这个肯定看起来是 C 风格的演员表,因此一定是不好的做法?

我见过一些例子,人们用 int(a) 替换 (int)a 之类的东西,理由是 C 风格的版本不好/错误,但链接的问题说它们都是一样的!

【问题讨论】:

  • function 是什么意思? int 不是函数。另外,你问的名字是什么?返回的对象?语法?
  • 语法,我猜function应该是type,我会更新问题

标签: c++ c++11 casting


【解决方案1】:

这些变种的名称是什么

  • type(expr) 被称为函数式转换。
  • (type)(expr) 被称为 C 风格的演员表。

它们是“坏的”吗?

Yes. 首先,两者在语义上是完全等价的。它们是“坏的”,因为它们不安全——它们可能等同于 static_cast,但同样是 reinterpret_cast,并且不知道 type expr 的类型不可能说1。在某些情况下,它们还会忽略访问说明符(C 风格的转换允许在私有继承层次结构中进行转换)。此外,它们不像显式 C++ 样式转换那样冗长,这是一件坏事,因为转换通常意味着在 C++ 中脱颖而出。


1 考虑int(x):根据x' 类型,这是static_cast(例如auto x = 4.2f;)或reinterpret_cast(例如auto x = nullptr; 在架构上其中int 大到足以容纳一个指针)。

【讨论】:

  • 这是否意味着函数样式转换是 C 特性?
  • 你是说为unsigned char c;int(c) 会产生与reinterpret_cast<int>(c) 相同的效果吗?
  • @πάνταῥεῖ 不。我是说对于(未知)类型T,语法上相同的演员可能是static_castreinterpret_cast。使演员表明确澄清了这一点。人们对他们是否认为int(c) 等是否可以接受存在分歧。就个人而言,我不知道。如果您想使用类似构造函数的语法,请使用int{c}(但这仅适用于允许隐式转换的情况)或static_cast<int>(c),并尽可能避免强制转换。如果演员表过于冗长,我将它们包装在一个函数中。
  • 这回答了我的评论:stackoverflow.com/questions/4474933/… 你怎么知道它会变成静态的还是重新解释的?
  • @paulm 一般来说,只有知道所有涉及的类型并知道哪些类型转换在这些类型上是合法的。请参阅标准以了解在哪些类型之间定义了 static_castreinterpret_cast 的规则。不幸的是,这些规则远非简单明了。更有理由避免模糊不清的演员表,这会使水更加浑浊。
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多