2011-09-19 26 views
7

In uno GoogleTechTalks video on Youtube, Bjarne Stroustrup parla dell'imminente standard C++ 0x. Nel video egli cita il seguente esempio:Questo esempio dell'uso della parola chiave 'esplicita' C++ è corretto?

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << d << "\n"; } 
    explicit Sick(int i) { std::cout << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2.1; 
    Sick s2(2.1); 
} 

voleva dire di mettere la parola explicit prima Sick(double) piuttosto che Sick(int), al fine di evidenziare i problemi connessi con le conversioni implicite in determinati contesti?

+3

Come dovremmo sapere cosa significava qualcuno in un video di YouTube? La cosa importante è che * tu * capisci l'uso di 'explicit' in questo esempio. –

+2

Entrambi sarebbero ragionevoli, a seconda di ciò che si desidera mostrare con l'esempio. – Flexo

+3

@Kerrek SB, Supponiamo di sapere cosa volesse dire perché sta cercando di comunicare cosa voleva dire. – ikegami

risposta

9

Nella sua discussione, Stroustrup afferma che l'inizializzazione diretta, come ad esempio

Sick s2(2.1); 

prenderà in considerazione solo i costruttori contrassegnati explicit se ci sono explicit costruttori. Questa non è la mia esperienza con diversi compilatori (inclusi GCC 4.6.1 e MSVC 16/VS 2010), e non riesco a trovare un tale requisito nello standard (anche se sarei interessato se qualcuno lo indicasse).

Tuttavia, se interi sono utilizzati nei inizializzatori, penso che l'esempio avrebbe mostrato cosa Stroustrup vuole dimostrare:

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << "double " << d << "\n"; } 
    explicit Sick(int i) { std::cout << "int " << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2; 
    Sick s2(2); 
} 

esecuzione il display sopra:

double 2 
int 2 

mostra che le due Inizializzazioni apparentemente equivalenti selezionano in realtà diversi costruttori.

(O come Truncheon menzionato nella domanda - e mi sono perso - che la parola chiave dovrebbe essere nel costruttore Sick(double d)).

Problemi correlati