Un operatore cast può essere esplicito?


84

Quando si tratta di costruttori, l'aggiunta della parola chiave explicitimpedisce a un compilatore entusiasta di creare un oggetto quando non era la prima intenzione del programmatore. Tale meccanismo è disponibile anche per gli operatori di casting?

struct Foo
{
    operator std::string() const;
};

Qui, ad esempio, mi piacerebbe poter eseguire il cast Fooin a std::string, ma non voglio che tale cast avvenga in modo implicito.

Risposte:


101

Sì e no.

Dipende dalla versione di C ++ che stai utilizzando.

  • C ++ 98 e C ++ 03 non supportano gli explicitoperatori di conversione del tipo
  • Ma C ++ 11 lo fa.

Esempio,

struct A
{
    //implicit conversion to int
    operator int() { return 100; }

    //explicit conversion to std::string
    explicit operator std::string() { return "explicit"; } 
};

int main() 
{
   A a;
   int i = a;  //ok - implicit conversion 
   std::string s = a; //error - requires explicit conversion 
}

Compilalo con g++ -std=c++0x, otterrai questo errore:

prog.cpp: 13:20: errore: richiesta conversione da 'A' a tipo non scalare 'std :: string'

Demo online: http://ideone.com/DJut1

Ma non appena scrivi:

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

L'errore scompare: http://ideone.com/LhuFd

A proposito, in C ++ 11, l'operatore di conversione esplicita è indicato come "operatore di conversione contestuale" se converte in booleano . Inoltre, se vuoi saperne di più sulle conversioni implicite ed esplicite, leggi questo argomento:

Spero possa aiutare.


9
Anche in C ++ 03, è facile evitare la conversione implicita. Basta chiamare la funzione toString, piuttosto che operator std::string. Naturalmente, questo potrebbe causare problemi con alcuni modelli. L'ho sempre usato toStringe non mi ha mai causato problemi, ma immagino che questo possa dipendere dal tuo stile di programmazione.
James Kanze

@MatthieuM. Proprio come operator std::string():-).
James Kanze

2
Io to_stringinvece uso . Aiuta il fatto che sia come lo chiama C ++ 11, quindi aiuta a scrivere codice compatibile con le versioni successive e aiuta con i modelli.
Luis Machuca

1
std::string s(a)o std::string s{a}dovrebbe funzionare anche come static_cast<std::string>(a).
alfC

2
@Bin: perché explicit operator bool() viene richiamato contestualmente dal compilatore quando scrivi if(std::cin). Nota la conversione che si verifica qui è (informalmente) chiamata conversione contestuale , non conversione implicita .
Nawaz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.