web-dev-qa-db-fra.com

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

En ce qui concerne les 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 convertir Foo en std::string, mais je ne veux pas qu'un tel casting se produise implicitement.

82
qdii

Oui et non.

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

  • C++ 98 et C++ 03 ne prennent pas en charge les opérateurs de conversion de type explicit
  • 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: conversion de 'A' en type non scalaire 'std :: string' demandée

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

J'espère que cela pourra aider.

99
Nawaz