83 votes

Un opérateur de distribution peut-il être explicite ?

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 ?

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

Ici, par exemple, je voudrais pouvoir lancer Foo en un std::string mais je ne veux pas que ces castings soient implicites.

100voto

Nawaz Points 148870

Oui et non.

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

  • C++98 et C++03 ne prennent pas en charge explicit opérateurs de conversion de type
  • Mais C++11 le 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 
}

Compilez-le avec g++ -std=c++0x vous obtiendrez cette erreur :

prog.cpp:13:20 : erreur : la conversion de 'A' en type non scalaire 'std::string' est demandée.

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

Mais dès que tu écris :

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é "opérateur de conversion contextuelle" s'il se convertit en boolean . Par ailleurs, si vous souhaitez en savoir plus sur les conversions implicites et explicites, lisez cette rubrique :

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X