Каковы преимущества и недостатки различных способов создания объектов? - PullRequest
1 голос
/ 22 апреля 2020

Существует несколько способов инициализации объекта, например, назначение копирования, инициализация копирования, прямая инициализация и т. Д. c. В следующем фрагменте показаны некоторые из них (не уверен, включает ли он все возможности

class A{
    A(int) { }      // converting constructor
    A(int, int) { } // converting constructor (C++11)
    operator bool() const { return true; }
};

class B{
    explicit B(int) { }
    explicit B(int, int) { }
    explicit operator bool() const { return true; }
};

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
    if (a1) ;      // OK: A::operator bool()
    bool na1 = a1; // OK: copy-initialization selects A::operator bool()
    bool na2 = static_cast<bool>(a1); // OK: static_cast performs 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 does not consider B::B(int,int)
    B b5 = (B)1;   // OK: explicit cast performs static_cast
    if (b2) ;      // OK: B::operator bool()
    bool nb1 = b2; // error: copy-initialization does not consider B::operator bool()
    bool nb2 = static_cast<bool>(b2); // OK: static_cast performs direct-initialization
}

. Можете ли вы дать краткое объяснение (возможно, некоторые пояснения низкого уровня) того, что делает каждый из них? У меня возникает вопрос из явных спецификаторов, которые, очевидно, ограничивают инициализацию копирования ... но зачем нам это нужно? ... тогда я просто начал спрашивать себя о другом способе создания экземпляров .. Спасибо!

...