2011-11-23 21 views
77

Quando si tratta di costruttori, l'aggiunta della parola chiave explicit impedisce 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?Un operatore di cast può essere esplicito?

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

Qui, per esempio, mi piacerebbe essere in grado di lanciare Foo in una std::string, ma io non voglio cast così implicitamente che accada.

risposta

94

Sì e No.

Dipende da quale versione di C++, che si sta utilizzando.

  • C++ 98 e C++ 03 non supportano explicit operatori di conversione di tipo
  • Ma C++ 11 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 
} 

Compilatelo con g++ -std=c++0x, si ottiene questo errore:

prog.cpp:13:20: error: conversion from 'A' to non-scalar type 'std::string' requested

Demo in linea: http://ideone.com/DJut1

Ma non appena si scrive:

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

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

proposito, in C++ 11, l'operatore di conversione esplicita viene indicato come "operatore conversione contestuale" se converte boolean. Inoltre, se volete sapere di più su conversioni implicite ed esplicite, leggere questo argomento:

Speranza che aiuta.

+1

+1. Potrebbe postare un esempio del codice C++ 11 per favore? – FailedDev

+1

@FailedDev: Fatto. :-) – Nawaz

+1

Molto bello grazie! – FailedDev

Problemi correlati