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