У меня есть следующие классы
class abc
{
private:
string name_;
public:
explicit abc(string name);
};
class xyz
{
private:
abc obj_abc_;
public:
xyz ():obj_abc_("NOTHING") { }; //I think this should give an error since explicit is used.
};
Согласно тому, что я понял о явном, я должен получать ошибку компилятора всякий раз, когда вызывается конструктор xyz; потому что я инициализирую obj_abc просто присвоив его строке. Но я не получаю никакой ошибки компилятора здесь.
Что мне не хватает?
explicit
«Конструктор» означает, что конструктор нельзя использовать для преобразования его типа параметра в тип класса. Так что неявное преобразование
abc x = "NOTHING";
будет запрещено, если конструктор explicit
, но не иначе. Явное преобразование
abc x("NOTHING");
будет разрешено в любом случае. В вашем случае прямая инициализация в списке инициализаторов является явной; так что ваш явный конструктор может быть использован для этого.
explicit
не предотвращает неявные преобразования в тип параметра конструктора; поэтому преобразование из "NOTHING"
в string
в вашем примере разрешено в любом случае, используя не явное string
конструктор.
Помимо синтаксической ошибки (используйте { }
вместо ;
) вы ничего не присваиваете или неявно конвертируете. Вы явно создаете объект в списке инициализации.