为什么当枚举或int值作为函数的bool传递时,gcc不会发出警告?

You*_*hwi 10 c++ gcc g++ gcc-warning

我有以下代码:

typedef enum
{
    FOO,
    BAR,
    BAZ
} foo_t;

static void afunc(bool is_it_on)
{
    /* do the job */
}

int main(void)
{
    afunc(BAZ);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

即使-Wall -Wextra为编译器提供了选项,编译此代码也不会生成任何警告消息.我甚至试图与-Wconversion选项,它没有采取任何影响,因为boolenum似乎是G ++相同的尺寸.(enum据我所知,类型的大小没有在规格中定义)

我已经梳理了gcc手册并且没有发现它.

问题:

  • 有没有办法强制编译器在这种情况下生成警告?
  • 或者这个隐式转换是否符合c ++规范?

我正在使用的编译器:gcc 4.1.2


Editted

结论:

对此唯一可行的解​​决方案似乎是定义一个表示0或1的新类型,并使用它代替bool.

代码如下,g ++抱怨类型转换:

typedef enum
{
    FOO1,
    FOO2
} foo_t;

typedef enum
{
    MY_FALSE,
    MY_TRUE
} my_bool_t;

void foo(my_bool_t a)
{
}

int main(void)
{
     /* 
      * gcc generates an error.
      * error: cannot convert ‘foo_t’ to ‘my_bool_t’ 
      * for argument ‘1’ to ‘void foo(my_bool_t)’
      */
    foo(FOO1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 9

是的,那些隐含的转换是完全合法的.

C++ 11 draft n3290,§4.12 布尔转换:

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

这些转换的警告(对于算术类型)可能会导致整个地方发出大量警告,我认为这不会是可管理的.

在C++ 11中,您可以使用作用域枚举来阻止隐式转换:

这不能编译缺乏从转换Foobool:

enum class Foo { ONE };

void tryit(bool b) { }

int main()
{
    tryit(Foo::ONE);
}
Run Code Online (Sandbox Code Playgroud)