【问题标题】:What is the difference between C-like casting and functional casting? [duplicate]C类铸造和功能铸造有什么区别? [复制]
【发布时间】:2011-01-23 19:04:01
【问题描述】:

考虑:

b = (int) a;    // C-like cast notation
b = int (a);    // Functional notation

【问题讨论】:

标签: c++ casting


【解决方案1】:

显然,我最初的回答是错误的。它们大致相等。虽然像long longvoid * 这样的复合类型名称不能直接使用函数式语法(即long long(val) 不起作用),但使用typedef 可以解决这个问题。

这两种转换符号都非常糟糕,应该避免。例如:

const char c = 'a';
void *fred = (void *)(&c);

有效,但不应该。

两种 C 风格的强制转换符号有时会表现得像 static_cast,有时像 const_cast,有时像 reinterpret_cast,或者甚至是两者的组合,具体取决于使用它的具体情况。这些语义相当复杂,而且在任何给定情况下都很难准确判断发生了什么。

我主要使用 C++ static_cast<type>(val) 样式转换,从不使用 C 样式转换。根据我对这个问题的研究,我也将停止对任何东西使用函数式强制转换。问题“C++ cast syntax styles”有一个很好的答案(已被接受),详细说明了原因。

【讨论】:

  • 这完全是错误的。即使int 没有构造函数,class A { operator int() const; }; int test( A a ) { return int(a); } 也能完美运行。具有单个参数的函数样式转换与等效的 C 样式转换具有完全相同的效果。
  • @Charles Bailey - 我读了更多,发现我错了。 :-) 我修正了我的答案。
  • 带指针的功能样式转换:typedef void * voidp; voidp fred = voidp(&c);
  • @PigBen - 哦,你是对的。 sigh 再次修正了我的答案。我讨厌人们使用 typedef 来掩盖类型是指针的事实。 :-(
  • @Omnifarious:我也是。我只是在展示一种可以完成演员阵容的方法。
【解决方案2】:

几乎没有任何区别。正式地,第一个告诉编译器该值是一个整数。这可能根本不会生成任何额外的代码。函数调用是内部执行其他类型转换的实际调用。智能编译器会对此进行优化,因此它们实际上是相同的。

【讨论】:

    【解决方案3】:

    没有任何区别。这是一个偏好问题。这些都是老式的演员表。

    【讨论】:

      【解决方案4】:

      这取决于您在哪里使用它以及如何使用它。 IE。如果你有值或指针(或指针的指针)。

      对于 C++,您应该阅读 *_cast 并改用它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        相关资源
        最近更新 更多