Не получено ожидаемое поведение с & quot; явным & quot; ключевое слово в переполнении стека

У меня есть следующие классы

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 просто присвоив его строке. Но я не получаю никакой ошибки компилятора здесь.
Что мне не хватает?

0

Решение

explicit «Конструктор» означает, что конструктор нельзя использовать для преобразования его типа параметра в тип класса. Так что неявное преобразование

abc x = "NOTHING";

будет запрещено, если конструктор explicit, но не иначе. Явное преобразование

abc x("NOTHING");

будет разрешено в любом случае. В вашем случае прямая инициализация в списке инициализаторов является явной; так что ваш явный конструктор может быть использован для этого.

explicit не предотвращает неявные преобразования в тип параметра конструктора; поэтому преобразование из "NOTHING" в string в вашем примере разрешено в любом случае, используя не явное string конструктор.

2

Другие решения

Помимо синтаксической ошибки (используйте { } вместо ;) вы ничего не присваиваете или неявно конвертируете. Вы явно создаете объект в списке инициализации.

0

По вопросам рекламы [email protected]