我不相信在编写C++时可以完全避免使用C风格的强制转换.我很惊讶地发现我需要使用C风格的转换来避免编译器截断警告:
short value_a = 0xF00D; // Truncation warning in VS2008
short value_b = static_cast<short>(0xF00D); // Truncation warning in VS2008
short value_c = (short)0xF00D; // No warning!
Run Code Online (Sandbox Code Playgroud)
还有其他场景没有C++风格替代C风格的演员吗?
GMa*_*ckG 12
在C++中,C风格的强制转换是根据C++风格的强制转换定义的(第5.4节).因此,对于每个演员你可以做C风格,有一个匹配的C++风格的演员(几乎).
"差不多"是C风格的强制转换会忽略基类可访问性.也就是说,没有等效的C++样式转换为以下内容:
struct foo {};
struct bar : private foo {};
bar b;
foo* f = (foo*)&b; // only way this can be done in a well-defined manner
Run Code Online (Sandbox Code Playgroud)
所以,没有严格意义上说完全抛弃C风格的演员阵容是不可能的.但是,(C++)风格的(组合)演员阵容不足的领域数量很少.
以上是"语言答案".您遇到的内容与C风格的演员表与C++演员表无关,只与编译器实现无关.警告绝对是特定于实现的,与C++无关.
因此,在这种特殊情况下,不要错误地使用您对这个特定编译器的发现来总结C++的结论.
您只是想混淆您的代码,就这么简单。编译器这样告诉你是完全正确的。
如果您确切地知道分配的值应该是什么,请使用它。我的猜测是,您有一些毫无根据的假设,即short16 位宽,并且目标机器的符号表示是二进制补码。如果是这样,请将 -4083 分配给您的变量。如果您只需要变量作为位向量,请使用无符号类型。
就 C 而言,该标准只是简单地说明了从一种整数类型到另一种整数类型的转换:
否则,新类型是有符号的,并且该值无法在其中表示;结果要么是实现定义的,要么引发实现定义的信号。
我想C++在这方面的观点没有太大不同。其他答案提到了边界情况,在 C++ 中,您需要“C”风格的强制转换来推翻 C++ 为您提供的所有类型检查。感觉需要它们就表明设计不好。
你举的例子当然不是我能找到任何有效情况的例子。