10

是否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.
4

1 回答 1

6

我会说 C++11 的 clang 是正确的:

3.9.1 基本类型[basic.fundamental]

6 bool 类型的值truefalse。[ 注意:没有有符号、无符号、短或长布尔类型或值。— 尾注] bool 类型的值参与积分促销 (4.5)。

bool值不为零,因此不能转换为空指针:

4.10 指针转换 [conv.ptr]

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

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

4 标准转换 [conv]

1 标准转换是具有内置含义的隐式转换。第 4 条列举了所有此类转换。标准转换序列是按以下顺序的标准转换序列:

  • 从以下集合进行零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。
  • 来自以下集合的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指向成员转换的指​​针和布尔转换。
  • 零个或一个资格转换。

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

于 2013-07-06T13:12:25.030 回答