Инициализация копирования: почему конструктор перемещения или копирования не вызывался, даже если отключено копирование?

У меня другой вопрос, потому что я могу знать, что такое копирование. Я учусь инициализации копии. Тем не менее, следующий код смутил меня, потому что я уже отключил копирование с помощью -fno-elide-contructors -O0 вариант.

#include <iostream>
using namespace std;
class test{
public :
    test(int a_, int b_) : a{a_}, b{b_} {}
    test(const test& other)
    {
        cout << "copy constructor" << endl;
    }
    test& operator=(const test& other)
    {
        cout << "copy assignment" << endl;
        return *this;
    }
    test(test&& other)
    {
        cout << "move constructor" << endl;
    }
    test& operator=(test&& other)
    {
        cout <<"move assignment" << endl;
        return *this;
    }

private :
    int a;
    int b;
};

test show_elide_constructors()
{
    return test{1,2};
}

int main()
{
    cout << "**show elide constructors**" <<endl;
    show_elide_constructors();
    cout << "**what is this?**" <<endl;
    test instance = {1,2};//why neither move constructor nor copy constructor is not called?
    cout << "**show move assignment**" <<endl;
    instance = {3,4};
    return 0;
}

Сначала я строю с помощью команды:g++ -std=c++11 -fno-elide-constructors -O0 main.cpp -o main и я получил результат следующим образом:

**show elide constructors**
move constructor
**what is this?**
**show move assignment**
move assignment

Тогда я построил с командой без -fno-elide-constructor -O0 возможность подтвердить это g++ действительно отключил оптимизацию в моей предыдущей сборке.

Итак, почему test instance = {1,2} не вызывает конструктор копирования или конструктор перемещения? Разве временный объект не создан из неявного преобразования? А также instance должен быть инициализирован этим временным объектом?

2 ответа

Решение

Зачем test instance = {1,2} не вызывает конструктор копирования или конструктор перемещения?

Это не должно test instance = {1,2} это copy-list-initialization, как следствие, соответствующий конструктор (т.е. test::test(int, int)) используется для построения объекта instance непосредственно. Нет необходимости создавать временный и вызывать конструктор копирования / перемещения здесь.

ХОРОШО. Я добавляю дополнительную информацию здесь.: Копировать инициализацию, Список инициализации.

Так T object = {other} действительно копировать инициализацию до C++11, которые рассматривают его как инициализацию списка.

Другие вопросы по тегам