4

我终于在我的程序中发现了一个错误,这是由返回类型的隐式类型转换引起的。即使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;
}
4

3 回答 3

3

这是正确的代码。if (i) where ihas typeint也是正确的。

n3376 4.12/1

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

于 2013-02-28T12:13:33.160 回答
1

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

bool, char, wchar_t, 有符号和无符号整数类型统称为整数类型

和:

type 的右值bool可以转换为 type 的右值 intfalse变为零和true变一。

于 2013-02-28T12:17:01.023 回答
0

确实,大多数(所有?)编译器在通常警告可能丢失有效数字或精度时(例如 int 到 char 转换或类似情况),但在转换为 bool 时例外。

我想这只有历史原因。

许多遗留代码使用类似的结构

如果(数字)...或如果(指针)...

代替

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

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

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

于 2013-02-28T13:26:25.573 回答