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

37

这些有什么区别:

int a;
// a gets some value
double pi = static_cast<double>(a)/3;
并且。
int a;
// a gets some value
double pi = double(a)/3;

你有没有见过后者?我记得在 Stroustrup 写的一些代码片段中看到过,但是我找不到参考资料了。


8
当变量 a 是一个整数类型时,使用 static_cast<double>(a)(double)adouble(a) 的语义是相同的。但当变量 a 是其他非标量类型或者是 constvolatile 时,它们之间的差异就会显现出来。 - ildjarn
@ildjarn,从性能角度来看呢? - Alessandro Jacopson
3
相同意味着完全相同,没有任何区别。 - ildjarn
1
@ildjarn:实际上,double(a) 编译速度会稍微慢一点(但不重要),因为它首先会尝试匹配 const_cast - KillianDS
6
在您的代码中查找 static_cast<double> 要容易得多。它更加显眼。 - user1356386
显示剩余2条评论
5个回答

25

有些人可能认为他们正在构造对象而不是进行类型转换。请考虑以下代码:

some_fun(std::string("Hello"));

很多人认为他们在调用构造函数,实际上却是在进行C风格的转换。事实上,转换会查看目标类型的构造函数以及其他长列表中的其他内容,因此最终会调用构造函数。

函数式符号转换具有与C转换种类相同的所有弱点:

  • 可能无意中去除const属性
  • 可能被静默转换为reinterpret_cast类型
  • 对于grep工具难以区分。

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


10

后者被称为函数符号法显式强制类型转换,在这种方法中,您明确指定a应该被视为double。使用此技术,您几乎可以将任何东西转换为任何类型。

前者是在C++中进行类型转换的首选方法。它进行基本检查,以确定您要转换的类型是否合理(子类指针转换为基类指针等)。此外,就像您展示的例子一样,您可以执行隐式转换。从技术上讲,您示例中的static_cast是显式的,但操作结果(赋值)是隐式的。


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即可。很难找到使用强制类型转换符号的表达式。

2
使用 static_cast 是一种安全的 C++ 风格的方式,而 (double) 则是一种不安全的旧式 C 风格的方式。
请参见这里:类型转换

1

整型变量a;

//This is the old way of converting a variable from its type to a double
double pi = double(a)/3;

//This is the new way of converting a variable from its type to a double
double pi = static_cast<double>(a)/3;

以下内容来自Walter Savitch的书籍《使用CPP进行问题解决,第10版》第222页:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接