在C++中,static_cast <double>(a)和double(a)之间有什么区别?

Ale*_*son 22 c++ casting

有什么区别

int a;
// a gets some value
double pi = static_cast<double>(a)/3;
Run Code Online (Sandbox Code Playgroud)

int a;
// a gets some value
double pi = double(a)/3;
Run Code Online (Sandbox Code Playgroud)

你见过后者吗?在我看来,我在Stroustrup写的一些片段中看到了它,但我找不到参考.

Edw*_*nge 15

有人可能认为他们正在建造而不是铸造.考虑:

some_fun(std::string("Hello"));
Run Code Online (Sandbox Code Playgroud)

许多人认为他们在那里调用构造函数,而实际上他们正在进行C风格的演员.事实上,在它看到的其他东西的长列表中,cast会查看目标类型的构造函数,因此它最终会调用构造函数.

功能表示法强制转换与其他类型的C强制转换具有相同的弱点:

  • 可能会无意中抛弃constness
  • 可以默默地变成重新诠释
  • 很难用grepping工具区分.

除此之外,在这两种情况下,您执行的操作完全相同.


gre*_*reg 8

后者被称为功能性符号显式类型转换,你直接说a应该被视为一个double.你可以使用这种技术将任何类型的任何东西投射到任何类型

前者是在C++中强制转换类型的首选方法.它执行基本检查以查看您要转换的类型是否有意义(指向基类指针的子类指针等).此外,与您显示的示例一样,您可以执行隐式转换.从技术上讲static_cast,您的示例中是显式的,但操作(赋值)的结果是隐式的.


Dav*_*men 6

static_cast<double> (a)和之间在生成的汇编代码方面没有区别(double) a。强制转换符号 的主要优点(type_id) cast_expression是它更灵活。在一种情况下它可能是等价的const_cast,在另外一家static_cast,在又一个,一个dynamic_cast,在另一个的组合,const_caststatic_cast(或dynamic_cast)。

这种力量也是一种弱点。铸造符号在不同的地方意味着不同的东西。另一个缺点是很容易找到xxx_cast<type_id> (cast_expression)。只需搜索_cast. 很难找到使用强制转换表示法的表达式。