2014-12-25 9 views
5

Niedawno dowiedziałem się o specyfikatorze explicit.Kiedy używać jawnego specyfikatora dla konstruktów wieloargumentowych?

Załóżmy, że mamy:

f(W, W, W); 

Teraz jeśli robimy

f(42, 3.14, "seven"); 

Kompilator będzie próbował następujące niejawne konwersje:

f(W(42), W(3.14), W("seven")); 

jeśli mamy zdefiniowane pasujące konstruktorów dla W , a mianowicie:

W(int); 
W(double); 
W(std::string); 

... to się uda.

Jeśli jednak zrobić pierwszy jeden wyraźny:

explicit W(int); 

... to wyłącza niejawna konwersja.

będzie mieć teraz napisać:

f(W(42), 3.14, "seven"); 

czyli zmusza cię jednoznacznie stwierdzić konwersję

Teraz na pytanie:

Jest możliwe, aby napisać:

explicit W(int,int); // 2 arguments! 

Th jest kompilowany!

Ale nie widzę żadnego odpowiadającego scenariusza, który może wymagać tej składni.

Czy ktoś może podać minimalny przykład?

+2

Część tego może być tylko ze względu na konsystencję, ponieważ funkcje wieloparametrowe mogą również mieć wartości domyślne, np. 'explicit W (int, int = 0);'. – Rufflewind

Odpowiedz

10

Jeśli twój konstruktor jest jawny, a klasa nie dostarcza nie jawnego konstruktora pobierającego initializer_list<T>, to nie możesz skopiować-listy-zainicjować instancji.

W w = {1,2}; // compiles without explicit, but not with 

Simple live example

cytaty z normą:

8,5/16

- w przypadku gdy inicjator jest (nie nawiasach) usztywnione inicjalizacji, liście, obiekt lub odwołanie jest zainicjowane na liście (8.5.4).

8.5.4/3

Lista inicjalizacja obiektu lub typu T odniesienia jest zdefiniowany jako następująco: ...

W przeciwnym razie, jeśli T jest typem klasy, bierze się pod uwagę konstruktorów. Odpowiednie konstruktory są wyliczane, a najlepsze jest wybrane poprzez rozdzielczość przeciążenia (13.3, 13.3.1.7). Jeśli do przekonwertowania któregokolwiek z argumentów wymagana jest zwężająca się konwersja (patrz poniżej), program jest źle sformułowany.

+0

Re-frazowanie mojego poprzedniego komentarza: może wzmianka o 'initializer_list' sprawia, że ​​odpowiedź jest myląca. Ale myślę, że to jest poprawne. – juanchopanza

+1

FGITW i tym podobne. –

+0

Kiedy mówisz "niejawny konstruktor", masz na myśli "konstruktor nie zadeklarowany ze słowem kluczowym" explicite "i to ma sens, ale kiedy go przeczytam, myślę o niejawnie wygenerowanych konstruktorach, które nie są zadeklarowane przez użytkownika. (W twoim przykładzie, na przykład konstruktor kopiowania "A".) Nie wiem, czy "niejawny konstruktor" jest ogólnie przyjętym terminem w taki sposób, w jaki go używasz, ale nie jest to taki, z którym miałem do czynienia przed . – hvd

Powiązane problemy