czy false
może być pośrednio przekształca się wskaźnik jest różny od szczęk ++ i G ++fałszywe domyślnie przejść na NULL
g ++ - 4,8: zawsze ostrzeżenie lub bez -std = C++ 11
clang ++ (trunk): ostrzeżenie, jeśli bez parametru -std = C++ 11, i błąd, jeśli z -std = C++ 11
Więc każdy wie, dlaczego g ++ i clang ++ zachowuje się inaczej i kto ma rację? Jakie akapity w standardzie C++ (zarówno C++ 03, jak i C++ 11) mówią o sytuacji.
Dzięki.
[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.
Co robi 'clang ++ -std = C++ 03'? – zch
Ostrzeżenie, tak samo jak bez -std = C++ 11 –
Zastanawiam się, czy to nie wszystko pochodzi z C z C++. C++ 03 jest kompatybilny z C89, w którym nie było typu bool, a "false" i "true" byłyby tylko makrami; jednak C++ 11 jest kompatybilny z C11, który ma typ bool i dlatego nie ma już sensu uznawać 'false' za kolejny alias typu "0". –