【发布时间】:2011-01-23 19:04:01
【问题描述】:
考虑:
b = (int) a; // C-like cast notation
b = int (a); // Functional notation
【问题讨论】:
考虑:
b = (int) a; // C-like cast notation
b = int (a); // Functional notation
【问题讨论】:
显然,我最初的回答是错误的。它们大致相等。虽然像long long 或void * 这样的复合类型名称不能直接使用函数式语法(即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 样式转换具有完全相同的效果。
typedef void * voidp; voidp fred = voidp(&c);
几乎没有任何区别。正式地,第一个告诉编译器该值是一个整数。这可能根本不会生成任何额外的代码。函数调用是内部执行其他类型转换的实际调用。智能编译器会对此进行优化,因此它们实际上是相同的。
【讨论】:
没有任何区别。这是一个偏好问题。这些都是老式的演员表。
【讨论】:
这取决于您在哪里使用它以及如何使用它。 IE。如果你有值或指针(或指针的指针)。
对于 C++,您应该阅读 *_cast 并改用它们。
【讨论】: