Spec-Zone.ru › C++

Конвертирующий конструктор

Конструктор, который не объявлен со спецификатором explicit и который можно вызвать с одним параметром(до C++11) называется конвертирующим конструктором.

В отличие от явных конструкторов, которые рассматриваются только при прямой инициализации (включая явные преобразования, такие как static_cast), конвертирующие конструкторы также рассматриваются при копирующей инициализации как часть последовательности преобразования, определяемой пользователем.

Считается, что конвертирующий конструктор задаёт неявное преобразование из типов своих аргументов (если они есть) в тип своего класса. Обратите внимание, что неявное преобразование также задаёт неявная функция преобразования, определяемая пользователем.

Неявно объявленные и определённые пользователем неявные конструкторы копирования и конструкторы перемещения являются конвертирующими конструкторами.

Пример

struct A
{
    A() { }         // converting constructor (since C++11)  
    A(int) { }      // converting constructor
    A(int, int) { } // converting constructor (since C++11)
};

struct B
{
    explicit B() { }
    explicit B(int) { }
    explicit B(int, int) { }
};

int main()
{
    A a1 = 1;      // OK: copy-initialization selects A::A(int)
    A a2(2);       // OK: direct-initialization selects A::A(int)
    A a3{4, 5};    // OK: direct-list-initialization selects A::A(int, int)
    A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int)
    A a5 = (A)1;   // OK: explicit cast performs static_cast, direct-initialization

//  B b1 = 1;      // error: copy-initialization does not consider B::B(int)
    B b2(2);       // OK: direct-initialization selects B::B(int)
    B b3{4, 5};    // OK: direct-list-initialization selects B::B(int, int)
//  B b4 = {4, 5}; // error: copy-list-initialization selected an explicit constructor
                   //        B::B(int, int)
    B b5 = (B)1;   // OK: explicit cast performs static_cast, direct-initialization
    B b6;          // OK, default-initialization
    B b7{};        // OK, direct-list-initialization
//  B b8 = {};     // error: copy-list-initialization selected an explicit constructor
                   //        B::B()

    [](...){}(a1, a4, a4, a5, b5); // may suppress "unused variable" warnings
}

См. также

  • копирующее присваивание
  • конструктор копирования
  • устранение копирования
  • конструктор по умолчанию
  • деструктор
  • explicit
  • инициализация
    • агрегатная инициализация
    • константная инициализация
    • копирующая инициализация
    • инициализация по умолчанию
    • прямая инициализация
    • список инициализаторов
    • инициализация списком
    • инициализация ссылки
    • инициализация значением
    • инициализация нулём
  • присваивание перемещением
  • конструктор перемещения
  • new

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/converting_constructor

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API