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

У меня другой вопрос, потому что я могу знать, что такое копирование. Я учусь инициализации копии. Тем не менее, следующий код смутил меня, потому что я уже отключил копирование с помощью -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 должен быть инициализирован этим временным объектом?

4

Решение

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

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

6

Другие решения

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

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

0

По вопросам рекламы [email protected]