Пространства имён
Варианты
Действия

Конструктор преобразования

Материал из cppreference.com
< cpp‎ | language
 
 
 
 

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

[править]Смотрите также

close