C++隐式转换基元的警告或错误

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)

问题

  1. b,返回类型a静默地转换为bool.
  2. c,返回的值b被静默提升为int64_t.

如何在原始类型之间隐式转换时收到警告或错误

注意

  1. 使用-Wconversion似乎只能获得与上述示例无关的几个任意转换.
  2. BOOST_STRONG_TYPEDEF 不是一个选项(我的类型需要是POD,因为它们在磁盘结构中使用).
  3. C也很有意思,但是这个问题与C++代码库有关.

Sig*_*ndo 5

C ++编程语言第3版的附录C.6中,即“隐式类型转换”,Bjarne Stroustrup将转换归类为升级转换:第一个“保留值”(这是您的情况2),第二个则不“保留值” (情况1)。

关于转换,他说:“基本类型可以以多种方式相互转换。我认为,允许太多转换。” 和“编译器可以警告许多可疑的转换。幸运的是,许多编译器确实可以进行。”

另一方面,提升是安全的,似乎编译器不应该为它们提供警告。

编译器警告通常不是强制性的。通常,在C ++ 草案和ANSI最终文档中,建议在“实施人员应发出警告”的地方:您可以自己检查该警告以获取更多信息。

编辑:添加了C ++ 11注意:

C ++编程语言,第4版中,已经报告了第3版的附录,并将其扩展为第10.5节“隐式类型转换”。

与前面的考虑相同,C ++ 11更精确地定义“缩小转换”,并加上{} -initializer表示法(6.3.5),截断会导致编译错误。