为什么没有隐式类型转换的警告?

时间:2013-02-28 12:08:42

标签: c++ gcc type-conversion

我终于找到了程序中的一个错误,这个错误是由返回类型的隐式类型转换引起的。即使使用g++ -Wall,也没有任何警告。

我想知道是否有某种方法可以快速找出这种无意识的错误?

#include <iostream>

// return type should be int, but I wrote bool by mistake
bool foo(int x) {
  return x;
}

int main() {
  for (int i = 0; i < 100; ++i) {
    std::cout << foo(i) << std::endl;
    // 0 1 1 1 1 1  ..
    // should be 0 1 2 3 4 ...
  }

  return 0;
}

3 个答案:

答案 0 :(得分:3)

这是正确的代码。如果(i)其中i类型int也是正确的。

n3376 4.12 / 1

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a bool类型的prvalue。零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。

答案 1 :(得分:1)

这是正常的类型促销。 来自C ++标准:

  

boolcharwchar_t以及有符号和无符号整数类型是统一的       称为整数类型

  

类型bool的右值可以转换为类型的右值       intfalse变为零,true成为一个。

答案 2 :(得分:0)

Iddeed,大多数(所有?)编译器在通常警告可能会丢失有效数字或精度时(例如在int转换为char或类似情况时)似乎在概念上不一致,但是转换为bool时会例外。

我认为只有历史原因。

许多遗留代码使用

之类的结构

if(number)...或if(pointer)...

而不是

if(number!= 0)...或if(pointer!= NULL)...

此外,后一种风格通常被认为过于冗长。

传统很方便,允许编写简洁的代码,但确实容易出错。它(有意识地)不支持某些其他语言(例如Java)。