Задать вопрос
@sabn1k
Возможно я написал чепуху, но попытайтесь понять

Для чего нужен explicit?

Я почти понял, для чего это нужно, но до конца все равно не могу понять. Поясните, пожалуйста.
Ок, explicit запрещает неявный вызов конструктора объекта, но зачем нам это? Почему нельзя просто его убрать и инициализировать объект неявно?
  • Вопрос задан
  • 3301 просмотр
Подписаться 4 Оценить 1 комментарий
Решения вопроса 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Почему нельзя просто его убрать и инициализировать объект неявно?

Явное лучше неявного.
Взял для себя правило помечать все конструкторы как explicit. Негативных эффектов не знаю, но не отстрелить ногу в будущем немного поможет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Alexander1705
Если вы определяете конструктор принимающий один и только один аргумент, такой конструктор будет использоваться для неявного приведения из типа аргумента в тип вашего класса. Используйте explicit, если хотите изменить это поведение.
class Foo
{
public:
    Foo(int v) : _v(v) {}
private:
    int _v;
};

class Bar
{
public:
    explicit Bar(int v) : _v(v) {}
private:
    int _v;
};

void baz(Foo foo) {/* some code */}
void qux(Bar bar) {/* some code */}

int main()
{
    Foo foo = Foo(4);
    Bar bar = Bar(4);

    baz(foo); // Ok.
    baz(4);   // Ok.
    qux(bar); // Ok.
    qux(4);   // Fail.
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы