2015-03-19 13 views
8

Questa domanda riguarda lo standard precedente di C++ 11 (C++ 03). explicit impedisce conversioni implicite da un tipo all'altro. Per esempio:È necessaria la parola chiave esplicita con un costruttore che prende più di un parametro?

struct Foo 
{ 
    explicit Foo(int); 
}; 

Foo f = 5; // will not compile 
Foo b = Foo(5); // works 

Se abbiamo un costruttore che prende due o più parametri, cosa explicit prevenire? Capisco che in C++ di inizializzazione 11 si è rinforzato, quindi impedirà costruzioni come:

struct Foo 
{ 
    explicit Foo(int, int); 
}; 

Foo f = {4, 2}; // error! 

ma in C++ di inizializzazione 03 non abbiamo rinforzato, in modo che tipo di costruzione è il explicit parola chiave che impedisce qui?

+1

AFAIK assolutamente nulla. È più facile da _ignore_ che da _forbid_. –

+0

Non è cambiato con C++ 11? –

+0

@NeilKirk Cosa è cambiato? Intendi cosa ho indicato nella mia domanda (l'inizializzazione del tutore)? –

risposta

4

Se disponiamo di un costruttore che accetta due o più parametri, cosa impedirà explicit?

Niente.

5

Potrebbe essere interessante se qualcuno cambia la firma del metodo con un parametro predefinito:

struct Foo 
{ 
    explicit Foo(int, int = 0); 
}; 

Con la parola chiave explicit, si idiomaticamente dire che non si vuole mai un costruttore per fare la conversione implicita.

Problemi correlati