我不认为在编写 C++ 时可以完全避免 C 风格的转换。我很惊讶find out我需要使用 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!
是否还有其他场景没有 C++ 风格的替代品来替代 C 风格的转换?
最佳答案
在 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
所以,不,严格来说,完全放弃 C 风格的转换是不可能的。但是,C++ 风格的类型转换(的组合)不足以解决问题的领域数不胜数。
以上为“语言回答”。您所遇到的与 C 风格转换与 C++ 转换无关,而只是编译器实现。警告绝对是特定于实现的,与 C++ 无关。
因此,不要错误地使用您在这种特定情况下在该特定编译器上的发现来总结关于 C++ 的一般情况。
关于c++ - 是否有可能在 C++ 中完全避免 C 风格的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4219286/