2017-10-18 96 views
6

Mam następujący fragment kodu, który przypisał typ nullptr do bool.Przypisano `nullptr` do typu` bool`. Który kompilator jest poprawny?

#include <iostream> 

int main() 
{ 
    bool b = nullptr; 
    std::cout << b; 
} 

W brzękiem 3.8.0 działa poprawnie. daje wynik 0. Clang Demo

Ale g ++ 5.4.0 daje błąd:

source_file.cpp: In function ‘int main()’: 
source_file.cpp:5:18: error: converting to ‘bool’ from ‘std::nullptr_t’ requires direct-initialization [-fpermissive] 
     bool b = nullptr; 

Który kompilator jest poprawna?

+0

dostaję ostrzeżenie kompilatora podczas uruchamiania go w kompilator żywo ty powiązane. "warning: niejawna konwersja stałej nullptr na" bool "[-Wnull-conversion]" – UnholySheep

+0

Zgodnie z błędem podanym przez GCC (i MSVC) oraz sekcję w [reference] (http://en.cppreference.com/ w/cpp/language/implicit_conversion) Powiedziałbym, że nie jest to dozwolone przez standard (a Clang zezwala na to jako rozszerzenie). – UnholySheep

+0

Cholernie nie powinno być. Jednym z punktów 'nullptr' było uczynienie za pomocą wskaźnika w kontekście boolowskim dobrze określonej rzeczy do zrobienia. : -/Ale, widzę, jak to może być poprawne, aby przynajmniej ostrzec o bezpośredniej konwersji w formie takiego zadania. Czy kompilator nadal podaje błąd, gdy masz 'nullptr && true' zamiast tylko' nullptr'? – Omnifarious

Odpowiedz

8

Z C++ Standard (4,12 logiczne konwersje)

1 A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. For direct-initialization (8.5), a prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

Więc ta deklaracja

bool b(nullptr); 

jest ważna i to

bool b = nullptr; 

jest źle.

Sam wskazał już tego problemu w isocpp

+1

Standard C++ 11 ma inne słownictwo. Zobacz https://timsong-cpp.github.io/cppwp/n3337/conv.bool. Czy tekst w twoim poście pochodzi z późniejszej wersji standardu? –

+1

Chociaż, dlaczego to działa dobrze na clang 3.8.0 jak OP stwierdził? Czy przez przypadek interpretował on 'nullptr' jako 0 w klangu? (Mniej prawdopodobne) –

+1

Czy trochę brakuje? Myślę, że powinno być "Tak więc ta deklaracja jest poprawna" (w przypadku pierwszego fragmentu) – UnholySheep