c++ - 是否有可能在 C++ 中完全避免 C 风格的转换?

标签 c++ c casting

我不认为在编写 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/

相关文章:

c++ - 为什么 map 在 C++ 中创建 NULL?

c - 程序执行未按预期顺序发生

java - 无法从 View 转换到 EditText

string - Powershell脚本-文件命名,日期时间和FTP

c++ - 模板构造函数重载问题

c++ - 使用cmake和vs2010链接到静态boost lib而不自动链接

C++ 新手 : my loop should CHANGE a string, 然后将字符串打印到文件中。但它正在添加到字符串中

c - 通过postgresql ODBC将数据从客户端导出到服务器

c++ - 使用 intel pin 工具的堆栈分配大小

java - 转换为ArrayList