В качестве учебного упражнения я смотрел, как работает автоматическое преобразование типов в C ++. Я знаю , что обычно следует избегать автоматического преобразования типов, но я хотел бы расширить свои знания C ++, понимая, как он работает в любом случае.
Я создал класс StdStringConverter
, который можно автоматически преобразовать в std::string
, но компилятор (g ++ 4.3.4 в Debian), по-видимому, не выполняет преобразование при сравнении объекта с реальным std::string
(пожалуйста, игнорируйте отсутствие передачи по ссылке и ненужное создание временных объектов):
#include <string>
class StdStringConverter
{
public:
explicit StdStringConverter(std::string name) : m_name(name) {}
operator const std::string () const { return m_name; }
private:
std::string m_name;
};
int main()
{
StdStringConverter converter(std::string("Me"));
const std::string name = "Me";
// Next line causes compiler error:
// no match for 'operator==' in 'converter == name'
return (converter == name) ? 0 : 1;
}
С другой стороны, если я немного изменю его на класс CStringConverter
, произойдет автоматическое преобразование , хотя сравнение указателей char
, вероятно, не то, что я намеревался:
#include <string>
class CStringConverter
{
public:
explicit CStringConverter(std::string name) : m_name(name) {}
operator const char* () const { return m_name.c_str(); }
private:
std::string m_name;
};
int main()
{
CStringConverter converter(std::string("Me"));
const char* name = "Me";
// Next line compiles fine, but they are not equal because the
// pointers don't match.
return (converter == name) ? 0 : 1;
}
Есть ли что-то особенное в разнице между std::string
и char*
в этом контексте, что компилятор не обрабатывает их одинаково?