2009-10-05 15 views
6

Biblioteka boostów i wygląda na zbliżający się standard C++ 0x, definiuje różne szablony cech typów w celu rozróżnienia między obiektami, które mają trywialne konstruktory, konstruktorów kopiowania, przydziałów lub destruktorów, a obiektami, które nie są używane. t. Jednym z najważniejszych zastosowań tego jest optymalizacja algorytmów dla niektórych typów, np. za pomocą memcpy.C++: has_trivial_X - cechy typu

Ale nie rozumiem prawdziwej praktycznej różnicy między różnymi szablonami has_trivial_X. Standard C++ definiuje tylko dwie szerokie kategorie typów, które nas dotyczą: POD i non-POD. Typ nie jest POD, jeśli ma zdefiniowany konstruktor, konstruktor kopiowania, operator przypisania lub destruktor. Innymi słowy, wszystko, co nie jest wbudowanym typem lub strukturą C wbudowanych typów, nie jest POD.

Jaki jest sens rozróżniania na przykład has_trivial_assign i has_trivial_constructor? Jeśli obiekt ma nietrywialnego operatora przypisania LUB nie jest trywialnym konstruktorem, nie jest to POD. Więc w jakich okolicznościach warto wiedzieć, że obiekt ma trywialny operator przypisania, ale nie jest trywialnym konstruktorem?

Innymi słowy, dlaczego nie zdefiniować pojedynczego szablonu cechy, is_pod<T>, i być z nim zrobić?

Odpowiedz

6

Definicja typu POD uległa rozluźnieniu w C++ 0A.

Typ może mieć nietrywialny konstruktor, ale może mieć trywialnego operatora przypisania.

E.g.

struct X 
{ 
    X() : y(-1) {} 
    X(int k, int v) : y(k * v) {} 

    int y; 
}; 

X może być "zapamiętywany", ale nie konstruowany trywialnie.