【问题标题】:Is a C-style cast identical to a function-style cast?C 风格的演员表与函数风格的演员表相同吗?
【发布时间】:2019-03-25 23:51:12
【问题描述】:

this answer到问题“什么时候应该使用static_cast、dynamic_cast、const_cast和reinterpret_cast?”:

C 风格转换和函数风格转换分别使用(type)objecttype(object) 进行转换。

然后它开始列出 C 风格转换的行为,但从不告诉函数风格转换是否相同。

我之所以问,是因为 Resharper for C++ 会在 C 样式转换的情况下警告我,但在函数样式转换的情况下不会警告我:

函数样式的情况与 C 样式的转换有何不同?或者,如果它们相同,它是否是 Resharper 中的一个错误,它也应该发出警告? int(d) 可以安全使用吗?它看起来比建议的static_cast<int>(d); 简单得多。

【问题讨论】:

  • 请注意,d 的两个转换是完全不同的语句。一个是初始化,另一个是赋值。你真的应该比较 int i = int(d); int j = (int)d;int i; i = int(d); i = (int)d;
  • @Caleth:编译器不会将两种方式都优化成相同的结果吗?
  • ints的情况下?是的。一般来说?不。但我的观点是关于声明和赋值有不同的语言规则

标签: c++ casting


【解决方案1】:

我没有引用标准,但 cppreference 通常足够好。

Explicit type conversion

函数转换表达式由一个简单的类型说明符或一个 typedef 说明符组成(换句话说,单字类型名称:unsigned int(expression)int*(expression) 无效),后跟括号中的单个表达式。 此转换表达式与对应的 C 样式转换表达式完全相同。

至于 Resharper,C++ cast 可能包含一个函数转换,因为这仅在 C++ 中有效。

您在问题中链接的答案解释了功能转换的安全性。在您的情况下,int(d) 应该等同于 static_cast<int>(d)。但一般来说,C 风格或函数式强制转换是不安全的,因为它们在某些情况下可能等同于 reinterpret_cast,例如(double*)some_int_ptr.

【讨论】:

  • “无论如何都不需要演员表”?如果我不使用强制转换,编译器会发出警告 C4244
  • 道歉。使用我使用的编译器(gcc),您必须明确要求它对此发出警告(-Wconversion 感兴趣的人)。更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2016-12-18
  • 2015-09-25
相关资源
最近更新 更多