Нет, они не то же самое. explicit
запрещает неявные преобразования для этого типа, если этот конструктор выбран - неявные преобразования в аргументах не имеют значения. delete
запрещает любую конструкцию, если этот конструктор выбран, и может использоваться для запрещения неявного аргумента .
Так, например:
struct X {
explicit X(int) { }
};
void foo(X) { }
foo(4); // error, because X's constructor is explicit
foo(X{3}); // ok
foo(X{'3'}); // ok, this conversion is fine
То есть отдельно от delete
ИНГ конструктор:
struct Y {
Y(int) { }
Y(char) = delete;
};
void bar(Y) { }
bar(4); // ok, implicit conversion to Y since this constructor isn't explicit
bar('4'); // error, this constructor is deleted
bar(Y{'4'}); // error, doesn't matter that we're explicit
Эти два метода также ортогональны. Если вы хотите, тип не быть неявно конвертируемым и только конструктивен из точно в int
, вы можете сделать так:
struct W {
explicit W(int) { }
template <class T>
W(T) = delete;
};
void quux(W);
quux(4); // error, constructor is explicit
quux('4'); // error, constructor is deleted
quux(4L); // error, constructor is deleted
quux(W{'4'}); // error, constructor is deleted
quux(W{5}); // ok
Обратите внимание, что это вызывает явный конструктор, а также конструктор copy/move. 'Z z (1LL);' будет вызывать только явный конструктор. – immibis