Przetestowałem poniższy kod z 3 kompilatorami i otrzymałem 3 różne wyniki: błąd, ostrzeżenie i ok.konwersja z nullptr_t na bool: poprawny czy nie?
- GCC (5,3): Błąd: nieprawidłowy zdefiniowana przez użytkownika konwersja z 'std :: nullptr_t' do 'const Thing &'
- dzyń (3.8): ostrzeżenie: niejawna konwersja nullptr stałą do 'bool'
- MSVC (14,1): nie ma błędu, bez ostrzeżenia
Który kompilator jest poprawna? Wiem, że jest to trywialna konwersja między typem wskaźnika a bool
. Ale co z tymi std::nullptr_t
i bool
?
(w celu Szczęk i MSVC oba dobrze z kodu. Clang jest trochę więcej komunikatów w pozytywny sposób.)
struct Thing
{
Thing(bool) {}
};
void addThing(const Thing&){}
int main()
{
addThing(nullptr); // warning or error on this line
}
Czy jestem jedyną osobą, której niepokoi logiczna niekonsekwencja? (nie sama odpowiedź). Jestem pewien, że zostało to wykonane z innych powodów, ale to * naprawdę * uderza mnie jako przypadek, w którym żaden nie powinien działać pod nieobecność operatora '_cast'. –
@BrettHale Moją interpretacją jest to, że 'nullptr' może być niejawnie konwertowane tylko na wskaźnik zerowy (dowolnego typu wskaźnika i dowolnego wskaźnika na typ pręta). Konwersja na 'bool' musi być wyraźna, ale nadal dozwolona (dla spójności innych wskaźników?). – songyuanyao
@ Brett Hale Nie uważam tego za niekonsekwentny. Wywołanie konstruktora jawnie niespodzianki, wywołuje konstruktory, które zostały oznaczone jako wyraźne, co jest dokładnie jedną z rzeczy, które zrobi rzut statyczny! Są to typy pierwotne, więc nie mają dosłownie konstruktorów, ale idea jest taka sama. –