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.
Oui et non.
Cela dépend de la version de C++ que vous utilisez.
explicit
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.