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

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

Материал из 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"
}

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