Да и нет.
Это зависит от того, какую версию C ++ вы используете.
- C ++ 98 и C ++ 03 не поддерживают
explicit
операторы преобразования типов.
- Но C ++ 11 делает.
Пример,
struct A
{
operator int() { return 100; }
explicit operator std::string() { return "explicit"; }
};
int main()
{
A a;
int i = a;
std::string s = a;
}
Скомпилируйте его g++ -std=c++0x
, вы получите эту ошибку:
prog.cpp: 13: 20: ошибка: запрошено преобразование из 'A' в нескалярный тип 'std :: string'
Онлайн-демонстрация: http://ideone.com/DJut1
Но как только напишете:
std::string s = static_cast<std::string>(a);
Ошибка уходит: http://ideone.com/LhuFd
Кстати, в C ++ 11 оператор явного преобразования называется «оператором контекстного преобразования», если он преобразуется в логическое значение . Кроме того, если вы хотите узнать больше о неявных и явных преобразованиях, прочтите этот раздел:
Надеюсь, это поможет.
toString
, а неoperator std::string
. Конечно, это может вызвать проблемы с некоторыми шаблонами. Я всегда использовалtoString
, и это никогда не доставляло мне проблем, но я полагаю, что это может зависеть от вашего стиля программирования.operator std::string()
:-).to_string
вместо этого. Помогает то, что это то, что C ++ 11 называет, поэтому он помогает писать код с прямой совместимостью и помогает с шаблонами.std::string s(a)
илиstd::string s{a}
также должен работать какstatic_cast<std::string>(a)
.explicit operator bool()
вызывает контекстно , когда вы пишетеif(std::cin)
. Обратите внимание, что происходящее здесь преобразование (неформально) называется контекстным преобразованием, а не неявным преобразованием.