Конструктор преобразования
Конструктор, который не объявлен со спецификатором 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" }