Как работает эта инициализация в виде списка? - PullRequest
2 голосов
/ 07 мая 2020

Я знаю о нескольких типах инициализации в C ++ и недавно узнал, почему инициализация списка должна быть предпочтительнее . Но как насчет этого кода? живая демонстрация

#include <iostream>
#include <string>

class A {
public:
    A(int x, std::string y) { std::cout << "normal\n"; }

    A(const A& obj) { std::cout << "copy\n"; }
};

int main(){
    A a({1, "2"}); // strange initialization
}

Выводит:

normal

Похоже, что инициализация какого-то списка смешана с вызовом конструктора в круглых скобках. Поэтому я подумал, что он создаст временный экземпляр A из {1, "2"}, а затем вызовет конструктор копирования. Но этого не происходит. Вместо этого он ведет себя как инициализация списка. Может, меня просто сбивает с толку синтаксис, а это это инициализация списка?

Если да, то как здесь синтаксис работает? Если нет, то что это за инициализация?

Ответы [ 2 ]

4 голосов
/ 07 мая 2020

Итак, я подумал, что он создаст временный экземпляр A из {1, "2"}, а затем вызовет конструктор копирования.

Вы правы. Здесь объект a инициализируется через конструктор A::A(int x, std::string y) напрямую из-за copy elision .

Вы можете скомпилировать с опцией -fno-elide-constructors (с режимом до C ++ 17, поскольку C ++ 17 такой вид копирования гарантирован), вы получите

normal
copy

LIVE

1 голос
/ 07 мая 2020

A a({1, "2"}); на самом деле copy-list-initialization, где braced-init-list используется вместо аргумента конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...