2015-05-07 15 views
5

Wraz z wprowadzeniem C++ 11, trivially copyableness zyskało całkiem na znaczeniu. Przede wszystkim w użyciu "std :: atomic". Podstawy są dość proste. Klasa foo jest trywialnie copyable jeżeli:Które reguły określają, czy obiekt można w łatwy sposób kopiować?

foo* src = new foo(); 
foo* dest = malloc(sizeof(foo)); 
memcpy(dest, src, sizeof(foo)); 

ma taki sam skutek jak:

foo* src = new foo(); 
foo* dest = new foo(src); 

So obiekt, w którym kopiowanie pamięci będą miały taki sam skutek jak konstruktora kopii. Jednak oczywiście jest to haczyk. Istnieją nie tylko konstruktorzy kopii. Ale także przesuwaj konstruktory, przesuwaj operatorów przypisania. Itd.

std::is_trivially_copyable może być użyty do sprawdzenia, czy obiekt można łatwo skopiować. Więc dzięki próbom i błędom możliwe jest uczynienie obiektu trywialnie kopiowalnym.

Ale oczywiście dobrze zdefiniowany zestaw reguł byłby nieco lepszy :). Tak więc moja prośba.

Odpowiedz

10

Najbardziej dokładnie zdefiniowany zestaw reguł będzie pochodzić bezpośrednio ze standardu. Są tu odpowiednie wpisy z projektem normy N4296:

Trywialnie-copyable typy zdefiniowane w [basic.types]/9

CV niewykwalifikowany typów skalarną Trywialnie copyable typy klas, takie układy typy i nieulotną wersje tego typu są określane zbiorczo jako trywialnie kopiowane typy.

klasy Trywialnie-copyable określa [klasa]/6

trywialny copyable klasą jest klasa że: ma nieoczywiste kopiowania konstruktorów ma nieoczywiste konstruktory move , nie ma nietrywialnych operatorów przypisania kopiowania, nie ma nietrywialnych operatorów przypisania ruchów i ma trywialny destruktor.

kopiowania/konstruktory w [class.copy]/12

kopia/konstruktor ruch dla klasy X jest trywialny, gdy nie jest wprowadzona przez użytkownika, jego parametrów TYPU listy jest równoważny z listą typu parametru niejawnej deklaracji, a jeśli klasa X nie ma żadnych funkcji wirtualnych i nie ma wirtualnych klas bazowych, a klasa X nie ma niestatycznych elementów danych typu o kwalifikacjach lotnych i konstruktora wybranego do kopiowania/move każdy obiekt podrzędny klasy bezpośredniej jest trywialny, a dla każdego niestatycznego elementu danych X, który jest typu klasy (lub ich tablicy), konstruktor wybrał skopiuj/przenieś tego członka jest banalny; w przeciwnym razie konstruktor copy/move nie jest trywialny.

Kopiowanie/przenoszenie operatorów przypisania w [klasa.Kopia]/25

kopia/ruch operatora przypisanie do klasy X jest trywialny, gdy nie jest wprowadzona przez użytkownika, jego parametrów, typu lista odpowiada parametrowi typu liście z domniemanym deklaracji a jeśli klasa X nie ma żadnych funkcji wirtualnych i nie ma wirtualnych klas bazowych, a klasa X nie ma niestatycznych elementów danych o typie z kwalifikacjami lotnymi, a operator przypisania wybrany do kopiowania/przenoszenia każdego obiektu podrzędnego klasy bezpośredniej jest trywialny i dla każdego niestatyczny element danych X, który jest typu klasy (lub ich tablica), operator przypisania wybrany do kopiowania/przemieszczania tego elementu jest trywialny; w przeciwnym razie operator przypisania kopiowania/przenoszenia nie jest trywialny.

destruktory w [class.dtor]/5

A destructor jest trywialny, gdy nie jest wprowadzona przez użytkownika i w przypadku gdy: destructor jest wirtualne wszystkich grup zasadowych bezpośrednich jego klasa ma trywialne destruktory, dla wszystkich nie statycznych elementów danych swojej klasy, które są typu klasy (lub ich tablic), każda taka klasa ma trywialny destruktor. W przeciwnym razie destruktor nie jest trywialny.

konstruktorzy użytkownika przewidziane w [dcl.fct.def.default]/5

Jawnie-niewykonaniem funkcji i niejawnie zadeklarowanej funkcji są zbiorczo nazywane funkcje wierzytelności, i realizacja powinna podać dla nich ukryte definicje (12.1 12.4, 12.8), co może oznaczać ich definicję jako usuniętą. Funkcja jest dostarczana przez użytkownika, jeśli została zadeklarowana przez użytkownika i nie jest jawnie domyślnie usunięta lub usunięta w pierwszej deklaracji . Podana przez użytkownika jawnie domyślna funkcja (tj. Jawnie domyślna po pierwszej deklaracji ) jest zdefiniowana w punkcie, w którym jest wyraźnie domyślna; jeśli taka funkcja jest domyślnie zdefiniowana jako usunięta, program jest źle sformułowany.

Krótka odpowiedź brzmi, że krótka odpowiedź jest czasem bardziej pomocna niż długa odpowiedź.

Powiązane problemy