15 Special member functions [special]

15.3 Conversions [class.conv]

15.3.1 Conversion by constructor [class.conv.ctor]

Конструктор, объявленный без, function-specifier explicit определяет преобразование типов его параметров (если есть) в тип своего класса. Такой конструктор называется converting constructor. [Example:

struct X {
    X(int);
    X(const char*, int =0);
    X(int, int);
};

void f(X arg) {
  X a = 1;          // a = X(1)
  X b = "Jessie";   // b = X("Jessie",0)
  a = 2;            // a = X(2)
  f(3);             // f(X(3))
  f({1, 2});        // f(X(1,2))
}

end example]

[ Note: Явный конструктор создает объекты так же, как неявные конструкторы, но делает это только там, direct-initialization где явно используются синтаксис или приведение типов ([expr.static.cast], [expr.cast]); см. также [over.match.copy]. Конструктор по умолчанию может быть явным конструктором; такой конструктор будет использоваться для выполнения инициализации по умолчанию или value-initialization. [Example:

struct Z {
  explicit Z();
  explicit Z(int);
  explicit Z(int, int);
};

Z a;                            // OK: default-initialization performed
Z b{};                          // OK: direct initialization syntax used
Z c = {};                       // error: copy-list-initialization
Z a1 = 1;                       // error: no implicit conversion
Z a3 = Z(1);                    // OK: direct initialization syntax used
Z a2(1);                        // OK: direct initialization syntax used
Z* p = new Z(1);                // OK: direct initialization syntax used
Z a4 = (Z)1;                    // OK: explicit cast used
Z a5 = static_cast<Z>(1);       // OK: explicit cast used
Z a6 = { 3, 4 };                // error: no implicit conversion

end example] ]end note

Неявный конструктор копирования / перемещения ([class.copy]) - это конструктор преобразования. [ Note: Неявно объявленный конструктор копирования / перемещения не является явным конструктором; он может вызываться для неявного преобразования типов. ]end note