允许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.
答案 0 :(得分:6)
我说C ++ 11的铿锵声是对的:
3.9.1基本类型[basic.fundamental]
6 bool类型的值
true
或false
。 [注意:没有signed,unsigned,short或long bool类型或值。 - 结束 注意] bool类型的值参与整体促销(4.5)。
bool
没有值零,因此无法转换为空指针:
4.10指针转换[conv.ptr]
1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或prvalue为 输入std :: nullptr_t。空指针常量可以转换为 指针类型;
有人可能建议转换序列由整数提升(bool
到int
)和空指针转换组成,但它无效:
4次标准转化[转化]
1标准转化是具有内置含义的隐式转化。 第4条列举了全套此类转换。一个标准 转换序列是一系列标准转换 以下顺序:
- 来自以下集合的零或一次转换:左值到右值转换,数组到指针转换和函数到指针 转换。
来自以下设置的- 零或一次转化:整体促销,浮点促销,整数转化,浮动 点转换,浮点积分转换,指针 转换,指向成员转化的指针和布尔转换。
- 零或一个资格转换。
[注意:标准转换序列可以为空,即它可以 包括没有转换。 - 尾注]标准转换序列 将被应用于表达式,如果有必要将其转换为 所需的目的地类型。