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

新手上路,请多包涵

之间有什么区别

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 编写的一些片段中看到了它,但我找不到参考。

原文由 Alessandro Jacopson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 845
2 个回答

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

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

许多人认为他们在那里调用了构造函数,而实际上他们正在执行 C 风格的转换。碰巧的是,强制转换将在它查看的一长串其他事物中查看目标类型的构造函数,因此在这里它最终会调用构造函数。

功能符号转换与其他类型的 C 转换具有所有相同的弱点:

  • 可以不经意间抛弃 constness
  • 可以默默地变成重新诠释的演员
  • 很难用 grepping 工具区分。

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

原文由 Edward Strange 发布,翻译遵循 CC BY-SA 3.0 许可协议

后者被称为 显式转换 的 _功能符号_,您明确地说 a 应该被视为 double 。您几乎可以使用这种技术将任何内容转换为任何类型。

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

原文由 greg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题