false
는 암시 적으로 포인터로 변환 할 수 사이에 차이가있다
그 소리 ++와 g ++ :거짓 암시 적으로 포인터를 null로 변환
그램 ++ - 4.8 : 또는 -std = C++ 11
없이 항상 경고clang ++ (트렁크) : -std = C++ 11이 아닌 경우 경고, -std = C++ 인 경우 오류 11
g ++ 및 clang ++의 작동 방식이 다른 이유는 무엇입니까? C++ 표준 (C++ 03과 C++ 11 모두)에서 어떤 단락이 상황에 대해 이야기합니다.
감사합니다. 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.
'clang ++ -std = C++ 03'은 무엇을합니까? – zch
경고, -std = C++이없는 경우와 동일 11 –
이 모든 것이 C++의 C 루 트를 따르지 않는지 궁금합니다. C++ 03은 bool 타입이없고'false'가 있고'true' 매크로 만 매크로가 될 수있는 C89와 호환됩니다. 그러나 C++ 11은 bool 타입을 가진 C11과 호환 가능하므로 더 이상 'false'를'0'의 또 다른 별칭으로 간주하지 않습니다. –