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