2011-11-23 3 views
77

Lorsqu'il s'agit de constructeurs, l'ajout du mot clé explicit empêche un compilateur enthousiaste de créer un objet alors que ce n'était pas la première intention du programmeur. Un tel mécanisme est-il également disponible pour les opérateurs de casting?Un opérateur de casting peut-il être explicite?

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

Ici, par exemple, je voudrais être en mesure de jeter Foo dans un std::string, mais je ne veux pas que cette fonte se produire implicitement.

Répondre

94

Oui et Non

Cela dépend de la version de C++, vous utilisez.

  • C++ 98 et C++ 03 ne prennent pas en charge explicit opérateurs de conversion de type
  • Mais 11 C++ fait.

Exemple,

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 
} 

compiler avec g++ -std=c++0x, vous obtiendrez cette erreur:

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

Démo en ligne: http://ideone.com/DJut1

Mais dès que vous écrivez:

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

L'erreur disparaît: http://ideone.com/LhuFd

BTW, en C++ 11, l'opérateur de conversion explicite est appelée "opérateur de conversion contextuelle" si elle se transforme en booléen. En outre, si vous voulez en savoir plus sur les conversions implicites et explicites, lisez ce sujet:

espoir qui aide.

+1

+1. Pourriez-vous poster un exemple de code C++ 11 s'il vous plaît? – FailedDev

+1

@FailedDev: Terminé. :-) – Nawaz

+1

Très gentil merci! – FailedDev

Questions connexes