Не получается ожидаемое поведение с "явным" ключевым словом в C++

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

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

2 ответа

Решение

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

abc x = "NOTHING";

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

abc x("NOTHING");

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

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

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

Другие вопросы по тегам