2014-11-25 35 views
5

Czytanie kodu Znalazłem klasę akceptującą tylko nowy C++ 11 nullptr_t jako parametr. Klasa wygląda jak ta poniżej.C++ nullptrt_t jako argument w konstruktorze

Czy mam rację, że jedyną rzeczą, którą mogę skonstruować obiekt, jest użycie wyłącznie nullptr?

class CA { 
public: 
CA(nullptr_t) {} 
}; 
+2

Tak. Zobacz np. [this 'std :: nullptr_t' reference] (http://en.cppreference.com/w/cpp/types/nullptr_t). –

+0

Teraz zastanawiam się, czy 'std :: nullpr_t()' jest poprawnym wyrażeniem. Nie widzę, dlaczego nie, więc to byłaby inna opcja. – MSalters

Odpowiedz

4

Czy poprawiam, że jedyną rzeczą, którą mogę zbudować obiekt, jest użycie wyłącznie nullptr?

Ilość ta jest pokryta §4.10 [conv.ptr]

null stały wskaźnik stanowi integralną typu może być przekształcany do prvalue typu std::nullptr_t.

gdzie NULL stałe jest zdefiniowany w następujący sposób:

NULL stałe jest liczbą całkowitą dosłownym (2.14.2) o wartości zero lub prvalue typu std::nullptr_t.

Innymi słowy, konstruktor może być wywołana również z różnymi literałów całkowitą o wartości 0:

CA{ 0 }; 
CA{ 0u }; 
CA{ 0LL }; 
CA{ 0x0 }; 
2

Zgodnie z dokumentacją:

std :: nullptr_t jest typu null pointer dosłowne, nullptr.

Czyli tak, można skonstruować ten obiekt tylko z nullptr lub odpowiadającej wartości integralnego (jako odpowiedź poniżej wyjaśnione). Sprawdź przykład this, ponieważ pokazuje sytuację, w której go potrzebujesz.

+0

Witam. Dzięki. Tak, to prawda i obejmuje także użycie wartości "0" dla wskaźnika zerowego i "NULL" (kredyt PIOTR S. http://stackoverflow.com/users/3953764/piotr-s, który usunął swoją odpowiedź. nie wiem dlaczego). –

+0

w C++ 11 NULL jest nadal (void *) 0 dla zgodności retro. Dlatego trzeba wprowadzić nową literalną nullptr. –

+0

@dau_sama: Nie, i nigdy tak nie było. W każdym standardzie C++ 'NULL' ma typ integralny. Może być '0', może być' 0L', może być całkiem sporo innych teorii, ale '(void *) 0' nie jest typem integralnym. – MSalters

6

Norma określa, w §2.14.7.1, że:

Wskaźnik dosłowny jest kluczowe nullptr. Jest to prvalue typu std::nullptr_t. [Uwaga: std::nullptr_t jest odrębnym typem, który nie jest ani typem wskaźnika, ani wskaźnikiem do typu elementu; raczej prwartością tego typu jest stała wskaźnika pustego i może zostać przekonwertowana na wartość wskaźnika pustego lub wartość wskaźnika elementu zerowego. -endnote]

Jedynym prvalue typu nullptr_t jest nullptr który następnie przekształca się w inny typ wskaźnika kierując się zasadami określonymi w §4.10 i §4.11.

Inne literałami całkowita może być przekształcany do wartości typu std::nullptr_t według §4.10.1:

null stały wskaźnik jest liczbą całkowitą dosłownym (2.14.2) o wartości zero lub prvalue typu std::nullptr_t.

W związku z tym można użyć literału pośredniego o wartości zero lub nullptr.

szczególności:

  • 0
  • 0u, 0U
  • 0l, 0L
  • 0ul, 0uL, 0Ul, 0UL
  • 0ll, 0LL
  • 0ull, 0uLL, 0ULL
  • nullptr
  • NULL

I może brakować niektórych przypadkach tak spadał swobodnie mnie poprawić.