2013-09-02 14 views
16

Książka, którą czytam, często wspomina, że ​​typ musi być typem dosłownym do użycia w pewnych sytuacjach, takich jak typy, które mogą używać constexpr. Ale jedyną podaną definicją było to, że typy dosłowne są typami arytmetycznymi, referencyjnymi lub wskaźnikowymi. Ale kiedy definiujemy typ constexpr, wydaje się, że musi być zainicjalizowany za pomocą literału lub zmiennej, która została oryginalnie zainicjalizowana literałem.Potrzebujesz wyjaśnienia co do definicji typu literalnego

Jestem zmieszany z tym, co kwalifikuje się jako typ literalny, a co nie.

Odpowiedz

7

z C++ 11 3,9/10:

typ jest dosłownym typu jeśli jest to:

  • typu skalarny; lub
  • typ odniesienia; lub
  • tablica typu literalnego; lub
  • typu klasy (Rozdział 9), który posiada wszystkie z następujących właściwości:
    • ma trywialne destructor
    • każde połączenie konstruktora pełnej ekspresji w usztywniających lub równy-inicjalizatorów dla nie statycznych elementów danych (jeśli występują) jest stałym wyrażeniem (5.19),
    • jest typem złożonym (8.5.1) lub ma co najmniej jeden konstruktor constexpr lub szablon konstruktora, który nie jest konstruktem kopiowania lub przenoszenia, i
    • wszystkie niestatyczne elementy danych i klasy bazowe są typu literalnego.

Więc w zasadzie to albo odwołanie lub prymitywny typ obiektu, lub coś, co może być wykonana z rodzaju dosłownym w constexpr-rodzaju sposób (tablic, kruszywa, czy zajęcia z constexpr konstruktor).

+2

Jaki jest przykład typu nie dosłownego? – Ares

+1

@Comrade: 'std :: string'. –

+0

Tak więc, ogólnie rzecz biorąc, typy nie literalne są typami klas, wyłączając specjalne typy klas zawarte powyżej w odpowiedzi. – Ares

2

C++ 11 (n3485) [basic.types] 9-10

arytmetyczne typów, rodzajów wyliczenia typów wskaźników, wskaźnik do rodzaju członkowskich, std::nullptr_t oraz wersjach cv wykwalifikowany tych typów są zbiorczo nazywane typy skalarne [...]

typ jest dosłownym typu jeśli jest to:

  • typu skalarny; lub
  • typ odniesienia; lub
  • tablica typu literalnego; lub
  • typu klasy, który posiada wszystkie następujące właściwości:
    • ma trywialną destruktora,
    • każde wywołanie konstruktora i pełnym ekspresji w usztywniających lub równy-inicjalizatorów dla non-static członkowie danych (jeśli w ogóle) jest stałym wyrażeniem,
    • jest to rodzaj kruszywa lub posiada co najmniej jeden constexpr konstruktor lub szablon konstruktor, który nie jest kopią lub przenieść konstruktor i
    • wszystkich jego non-statycznych pól a klasy bazowe są nieulotnymi literalnymi typami.

[dcl.init.aggr]/1

agregat jest tablicą lub klasy bez konstruktorów dostarczane przez użytkowników, bez klamra lub równy -initializatory dla niestatycznych członków danych, bez prywatnych lub chronionych niestatycznych elementów danych, bez klas podstawowych i bez funkcji wirtualnych.

Powiązane problemy