false隐式转换为空指针

时间:2013-07-06 10:17:26

标签: c++ c++11

允许false是否允许隐式转换为指针在clang ++和g ++之间是不同的:

g ++ - 4.8:总是带或不带-std = c ++ 11的警告

clang ++(trunk):如果没有-std = c ++ 11则会出现警告,如果使用-std = c ++ 11则会出现错误

所以任何人都知道为什么g ++和clang ++表现不同,谁是正确的? C ++标准中的哪些段落(包括C ++ 03和C ++ 11)都讨论了这种情况。

感谢。

[hidden ~]$ cat b.cpp
const char* f() { return false; }

[hidden ~]$ g++ -c b.cpp
b.cpp: In function ‘const char* f()’:
b.cpp:1:26: warning: converting ‘false’ to pointer type ‘const char*’ [-Wconversion-null]
 const char* f() { return false; }
                          ^
[hidden ~]$ g++ -std=c++11 -c b.cpp
b.cpp: In function ‘const char* f()’:
b.cpp:1:26: warning: converting ‘false’ to pointer type ‘const char*’ [-Wconversion-null]
 const char* f() { return false; }
                          ^
[hidden ~]$ clang++ -c b.cpp
b.cpp:1:26: warning: initialization of pointer of type 'const char *' to null from a constant boolean expression [-Wbool-conversion]
const char* f() { return false; }
                         ^~~~~
1 warning generated.
[hidden ~]$ clang++ -std=c++11 -c b.cpp
b.cpp:1:26: error: cannot initialize return object of type 'const char *' with an rvalue of type 'bool'
const char* f() { return false; }
                         ^~~~~
1 error generated.

1 个答案:

答案 0 :(得分:6)

我说C ++ 11的铿锵声是对的:

  

3.9.1基本类型[basic.fundamental]

     

6 bool类型的值 truefalse 。 [注意:没有signed,unsigned,short或long bool类型或值。 - 结束   注意] bool类型的值参与整体促销(4.5)。

bool没有值零,因此无法转换为空指针:

  

4.10指针转换[conv.ptr]

     

1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或prvalue为   输入std :: nullptr_t。空指针常量可以转换为   指针类型;

有人可能建议转换序列由整数提升(boolint)和空指针转换组成,但它无效:

  

4次标准转化[转化]

     

1标准转化是具有内置含义的隐式转化。   第4条列举了全套此类转换。一个标准   转换序列是一系列标准转换   以下顺序:

     
      
  • 来自以下集合的零或一次转换:左值到右值转换,数组到指针转换和函数到指针   转换。
  •   来自以下设置的
  • 零或一次转化整体促销,浮点促销,整数转化,浮动   点转换,浮点积分转换,指针   转换,指向成员转化的指针和布尔转换。
  •   
  • 零或一个资格转换。
  •   
     

[注意:标准转换序列可以为空,即它可以   包括没有转换。 - 尾注]标准转换序列   将被应用于表达式,如果有必要将其转换为   所需的目的地类型。