2011-07-21 17 views
22

Powiel możliwe:
What does the explicit keyword in C++ mean?C++ wyraźnej kluczowe dla funkcji bez argumentów

Czy istnieje powód, aby użyć słowa kluczowego explicit dla funkcji, które nie mają żadnych argumentów? Czy to ma jakiś wpływ? Zastanawiam się, bo po prostu natknąłem linii

explicit char_separator()

pod koniec boost strona dokumentującego :: char_separator (http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm), ale nie jest to wyjaśnione dalej istnieje.

+6

To nie jest dupe; to pytanie dotyczy bardzo konkretnego przypadku kluczowego słowa kluczowego "explicite". –

+4

To nie jest funkcja, to jest konstruktor - zobacz http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean/121163#121163 – Skizz

+0

@ larsmans Trudno powiedzieć bez oglądania jakiś prawdziwy przykład: –

Odpowiedz

14

Reading explanation of members:

explicit char_separator(const Char* dropped_delims, 
         const Char* kept_delims = "", 
         empty_token_policy empty_tokens = drop_empty_tokens) 
explicit char_separator() 

explicit kluczowe dla 1 konstruktora wymaga wyraźnej tworzenie obiektów typu char_separator. What does the explicit keyword mean in C++? bardzo dobrze radzi sobie z jawnym słowem kluczowym.

Słowo kluczowe explicit dla 2. konstruktora jest szumem i jest ignorowane.

EDIT

od C++ standard:

7.1.2 P6 mówi:

Wyraźna specifier stosuje się tylko w deklaracjach konstruktorów wewnątrz deklaracji klasy; patrz 12.3.1.

12.3.1 p2 mówi:

Wyraźne konstruktor tworzy obiekty, tak jak zakaz wyraźnych konstruktorów, ale czyni to jedynie w przypadku bezpośredniego inicjalizacji składni (8,5) lub gdzie odlewnictwa (5.2. 9, 5.4) są wyraźnie używane. Domyślny konstruktor może być jawnym konstruktorem; taki konstruktor będzie używany do wykonania domyślnej inicjalizacji lub inicjalizacji wartości (8.5). [przykład:

class Z { 
public: 
explicit Z(); 
explicit Z(int); 
// ... 
}; 
Z a;    // OK: default-initialization performed 
Z a1 = 1;   // error: no implicit conversion 
Z a3 = Z(1);  // OK: direct initialization syntax used 
Z a2(1);   // OK: direct initialization syntax used 
Z* p = new Z(1); // OK: direct initialization syntax used 
Z a4 = (Z)1;  // OK: explicit cast used 
Z a5 = static_cast<Z>(1); // OK: explicit cast used 

końcem przykład]

więc konstruktor domyślny z kluczowych explicit jest taki sam jak bez tego hasła.

Powiązane problemy