Может ли оператор приведения быть явным? - PullRequest
81 голосов
/ 23 ноября 2011

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

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

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

1 Ответ

98 голосов
/ 23 ноября 2011

Да и нет.

Это зависит от того, какую версию 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, вы получите эту ошибку:

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

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

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

...