Может ли оператор трансляции быть явным?

Когда дело доходит до конструкторов, добавление ключевого слова explicit не позволяет энтузиастскому компилятору создавать объект, если это не было первым намерением программистов. Доступен ли такой механизм для операторов литья?

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

Здесь, например, я хотел бы использовать Foo в std::string, но я не хочу, чтобы такой приказ выполнялся неявно.

Ответ 1

Да и №

Это зависит от того, какую версию С++ вы используете.

  • С++ 98 и С++ 03 не поддерживают операторы преобразования типов explicit
  • Но С++ 11. делает.

Пример

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 
}

Скомпилируйте его с помощью g++ -std=c++0x, вы получите эту ошибку:

prog.cpp: 13: 20: ошибка: преобразование из "A" в нескалярный тип "std::string" запрошено

Демо-версия онлайн: http://ideone.com/DJut1

Но как только вы напишете:

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

Ошибка исчезнет: http://ideone.com/LhuFd

BTW, в С++ 11 явный оператор преобразования называется "оператором контекстного преобразования", если он преобразуется в логическое. Кроме того, если вы хотите узнать больше о неявных и явных преобразованиях, прочитайте эту тему:

Надеюсь, что это поможет.