Mat*_*ner 18 c++ gcc type-conversion implicit-conversion
我已经对一些C++代码做了一些重构,并发现了许多我不知道的隐式转换引起的错误.
struct A *a();
bool b() {
return a();
}
void c() {
int64_t const d(b());
}
Run Code Online (Sandbox Code Playgroud)
b,返回类型a静默地转换为bool.c,返回的值b被静默提升为int64_t.如何在原始类型之间隐式转换时收到警告或错误?
-Wconversion似乎只能获得与上述示例无关的几个任意转换.BOOST_STRONG_TYPEDEF 不是一个选项(我的类型需要是POD,因为它们在磁盘结构中使用).在C ++编程语言第3版的附录C.6中,即“隐式类型转换”,Bjarne Stroustrup将转换归类为升级和转换:第一个“保留值”(这是您的情况2),第二个则不“保留值” (情况1)。
关于转换,他说:“基本类型可以以多种方式相互转换。我认为,允许太多转换。” 和“编译器可以警告许多可疑的转换。幸运的是,许多编译器确实可以进行。”
另一方面,提升是安全的,似乎编译器不应该为它们提供警告。
编译器警告通常不是强制性的。通常,在C ++ 草案和ANSI最终文档中,建议在“实施人员应发出警告”的地方:您可以自己检查该警告以获取更多信息。
编辑:添加了C ++ 11注意:
在C ++编程语言,第4版中,已经报告了第3版的附录,并将其扩展为第10.5节“隐式类型转换”。
与前面的考虑相同,C ++ 11更精确地定义“缩小转换”,并加上{} -initializer表示法(6.3.5),截断会导致编译错误。
| 归档时间: |
|
| 查看次数: |
10650 次 |
| 最近记录: |