2014-12-15 10 views
13

C++ 14 void jest typu dosłownymVoid jako typ literalny?

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

- nieważny; lub

- typ 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

- to jest typu kruszywo (8.5.1) lub posiada co najmniej jeden constexpr konstruktor konstruktor lub szablon, który nie jest kopią lub przenieść konstruktora i

- wszystko jego non-statycznych danych i klas bazowych są nielotnych typów dosłowne.

C++ 11 void nie jest typu dosłownym

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

- rodzaj skalarny; lub

- typ odniesienia odnoszący się do typu literalnego; 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 wezwanie konstruktora pełnej ekspresji w szynie albo-same wymiary inicjalizatory non-statycznych danych (jeśli w ogóle) jest stałym wyrażeniem (5.19),

- jest to rodzaj kruszywa (8.5.1) lub posiada co najmniej jeden constexpr konstruktora lub konstruktora szablonu, który nie jest skopiować lub przenieść konstruktora i

- wszystkie niestatyczne elementy danych i klasy podstawowe mają literalne typy .

Dlaczego więc void jest literałem? Jakie korzyści oferuje?

+1

Podobne do [Wracając pustkę?] (Http://stackoverflow.com/q/20478193/1708801) –

Odpowiedz

18

Od void jest literal type, constexpr funkcje mogą mieć typ zwrotu void w C++ 14.

It's covered in this proposal.

Cytat wniosek:

Dowolny wyraz-stwierdzenie jest dozwolone, w celu umożliwienia wywołań funkcji przeprowadzających kontrole i umożliwienia dochodzić podobny konstruktów. void również staje się literalnym typem, więc funkcje constexpr , które istnieją tylko w celu przeprowadzenia takich kontroli, mogą zostać unieważnione.

#define ASSERT(expr) \ 
    (void)((expr) || assert_failed(#expr, __LINE__, __FILE__)) 
void assert_failed(...); // not constexpr 
struct S { 
    std::array a<int, 100>; 
    size_t i; 

    constexpr void check_invariants() const { 
    ASSERT(i < a.size()); 
    ASSERT(a[i] == 0); 
    } 
    S(std::array<int, 100> a_, size_t i_) : a(a_), i(i_) { 
    check_invariants(); 
    } 
}; 
+0

w C++ 14, można od 'zmienna void' być zadeklarowane/zwrócony? Oczywiście nie jest to z natury użyteczne i nie można uzyskać do niego dostępu, ale w przypadku kodu generycznego/szablonowego może czasem uprościć pewne rzeczy. – StilesCrisis

Powiązane problemy