Может ли оператор приведения быть явным?
когда дело доходит до конструкторов, добавление ключевого слова explicit
предотвращает энтузиазм компилятора от создания объекта, когда это не было первым намерением программиста. Доступен ли такой механизм и для операторов литья?
struct Foo
{
operator std::string() const;
};
вот, например, я хотел бы иметь возможность бросить Foo
на std::string
, но я не хочу, чтобы такой бросок произошел неявно.
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. Кроме того, если вы хотите узнать больше о неявных и явных преобразованиях, прочитайте этот раздел:
надеюсь, что это поможет.