Ответ 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 явный оператор преобразования называется "оператором контекстного преобразования", если он преобразуется в логическое. Кроме того, если вы хотите узнать больше о неявных и явных преобразованиях, прочитайте эту тему:
Надеюсь, что это поможет.