Конструктор преобразования
Конструктор, который не объявлен со спецификатором explicit и который может быть вызван с одним параметром (до C++11), называется конструктором преобразования.
В отличие от явных конструкторов, которые учитываются только во время прямой инициализации (включая явные преобразования, такие как static_cast), конструкторы преобразования также учитываются во время инициализации копированием как часть определённой пользователем последовательности преобразования.
Говорят, что конструктор преобразования задаёт неявное преобразование типов своих аргументов (если они есть) в тип своего класса. Обратите внимание, что неявная определяемая пользователем функция преобразования также задаёт неявное преобразование.
Неявно объявленные и определяемые пользователем неявные конструкторы копирования и конструкторы перемещения являются конструкторами преобразования.
Пример
struct A
{
A() { } // конструктор преобразования (начиная с C++11)
A(int) { } // конструктор преобразования
A(int, int) { } // конструктор преобразования (начиная с C++11)
};
struct B
{
explicit B() { }
explicit B(int) { }
explicit B(int, int) { }
};
int main()
{
A a1 = 1; // OK: инициализация копированием выбирает A::A(int)
A a2(2); // OK: прямая инициализация выбирает A::A(int)
A a3{4, 5}; // OK: прямая инициализация списком выбирает A::A(int, int)
A a4 = {4, 5}; // OK: инициализация копированием списка выбирает A::A(int, int)
A a5 = (A)1; // OK: явное приведение выполняет static_cast, прямую инициализацию
// B b1 = 1; // ошибка: инициализация копированием не учитывает B::B(int)
B b2(2); // OK: прямая инициализация выбирает B::B(int)
B b3{4, 5}; // OK: прямая инициализация списком выбирает B::B(int, int)
// B b4 = {4, 5}; // ошибка: инициализация копированием списка
// выбрала явный конструктор B::B(int, int)
B b5 = (B)1; // OK: явное приведение выполняет static_cast, прямую инициализацию
B b6; // OK, инициализация по умолчанию
B b7{}; // OK, прямая инициализация списком
// B b8 = {}; // ошибка: инициализация копированием списка
// выбрала явный конструктор B::B()
[](...){}(a1, a4, a4, a5, b5); // может подавлять предупреждения "unused variable"
}