Преобразование конструктора
Конструктор, который не объявлен с модификатором 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/w/cpp/language/converting_constructor