2012-09-14 15 views
6

żądanie z n3337 12.3.1/3niejawny kopii konstruktor

Konstruktor bez wyraźnego kopii/przejście (12,8), to konwersja konstruktora. Niejawnie deklarowany konstruktor copy/move nie jest jawnym konstruktorem ; można go wywołać w przypadku niejawnych konwersji typów.

Cytat ANSI ISO IEC 14882 2003

Non-wyraźne kopiowaniem konstruktor (12,8) jest konwersja konstruktora. Dekoderowo deklarowany konstruktor kopii nie jest jawnym konstruktorem; może być wywołany dla konwersji typu niejawnego.

mam żadnych pomysłów, jak copy-constructor mogą być wykorzystywane do implicit typu conversions. A jeśli jest to błąd w normie, dlaczego nie został poprawiony od czasu standardu C++ 03? Wszelkie linki i przykłady (jeśli możemy go używać dla type conversions) są naprawdę doceniane.

+1

+1 za zadanie pytania. Nawet ja miałem tę wątpliwość po przeczytaniu standardowego tekstu cytowanego w twojej odpowiedzi w innym temacie. – Nawaz

Odpowiedz

8

Konstruktor kopii można przekształcić z obiektu typu uzyskanych przez cięcie go:

struct A {}; 
struct B : A {}; 

B b; 
A a = b; // uses A::A(A const&) to convert B to A 
+1

Co sprawia, że ​​konstruktory kopii są z natury niebezpieczne, gdy są ignorowane. Dobra praktyka jest taka, że ​​jeśli nie chcesz ich, powinieneś zapobiec domyślnym Konstruktorom Kopii i Operatorom Przypisania. Przed wersją C++ 11 można to zrobić, deklarując je jako prywatne, a nie implementując je (pomaga to skomentować, że robisz to). W C++ 11 można zamienić implementację na '= delete'. –

+5

@ JonathanSeng: To jest jedno podejście. Wolę unikać dziedziczenia z typów nie-abstrakcyjnych, więc krojenie nie jest możliwe. Rzadko istnieje powód, by dziedziczyć po czymkolwiek innym niż abstrakcyjnym interfejsie. –

0

W implict inline funkcję inline jest zdefiniowana w klasie definition.the rolki nie powoduje ono używane

Powiązane problemy