2014-12-25 4 views
5

Recentemente ho appreso l'identificatore explicit.Quando utilizzare lo specificatore esplicito per i costruttori a più argomenti?

Supponiamo di avere:

f(W, W, W); 

Ora, se facciamo

f(42, 3.14, "seven"); 

Il compilatore cercherà i seguenti conversioni implicite:

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

Se abbiamo definito i costruttori di corrispondenza per W , ovvero:

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

... ci riuscirà.

Tuttavia, se facciamo il primo esplicito:

explicit W(int); 

... questo disabilita la conversione implicita.

Si avrebbe ora dovuto scrivere:

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

cioè si costringe a dichiarare esplicitamente la conversione

D'ora in poi la domanda:

E 'possibile scrivere:

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

Th è compilato!

Ma non riesco a vedere nessuno scenario corrispondente che potrebbe richiedere questa sintassi.

Qualcuno può fornire un esempio minimo?

+2

Parte di questo potrebbe essere solo per motivi di coerenza, poiché le funzioni multiparametriche possono anche avere valori predefiniti, ad es. 'esplicito W (int, int = 0);'. – Rufflewind

risposta

10

Se il costruttore è esplicito e la classe non fornisce un costruttore non esplicito che prende initializer_list<T>, non è possibile inizializzare un'istanza di copia-elenco.

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

Simple live example

Citazioni da serie:

8.5/16

- Se l'inizializzatore è un (non tra parentesi) rinforzato-init-list, il L'oggetto o il riferimento è inizializzato in elenco (8.5.4).

8.5.4/3

List-inizializzazione di un oggetto o di riferimento di tipo T è definito come segue: ...

Altrimenti, se T è un tipo di classe, vengono considerati i costruttori. I costruttori applicabili sono enumerati e il migliore viene scelto tramite la risoluzione di sovraccarico (13.3, 13.3.1.7). Se per convertire uno qualsiasi degli argomenti è richiesta una restringente conversione (vedi sotto), il programma è mal formato.

+0

Riassumendo il mio commento precedente: forse la menzione di 'initializer_list' rende la risposta confusa. Ma penso sia corretto. – juanchopanza

+1

FGITW e tutto il resto. –

+0

Quando si dice "costruttore implicito", si intende "costruttore non dichiarato con la parola chiave 'explicit'", e questo ha senso, ma quando lo leggo, penso a costruttori generati implicitamente che non sono dichiarati dall'utente. (Nel tuo esempio, il costruttore di copie di 'A', per esempio.) Non so se" costruttore implicito "è un termine generalmente accettato nel modo in cui lo stai usando, ma non è uno che ho incontrato prima . – hvd

Problemi correlati