Конструктор 2 не принимает адрес строки, const string& a
означает постоянную ссылку на объект std::string
.Причина, по которой вы можете передать конструктору строковый литерал, заключается в том, что класс std::string
содержит неявный конструктор, который принимает const char *
.Таким образом, компилятор неявно преобразует ваш строковый литерал в std::string
, прежде чем вызывать конструктор 2.
Так что следующие 2 строки эквивалентны
Dude d2 = Dude("bye");
Dude d2 = Dude( std::string("bye") );
Кроме того, при написании конструкторов предпочитайте инициализировать членпеременные в списке инициализатора, а не в теле конструктора
Dude(const string &a) : x(a) {}