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


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

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

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

1 81

1 ответ:

да и нет.

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

  • C++98 и C++03 не поддерживают explicit операторы преобразования типов
  • но C++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, вы получите эту ошибку:

прог.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

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

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