У меня другой вопрос, потому что я могу знать, что такое копирование. Я учусь инициализации копии. Тем не менее, следующий код смутил меня, потому что я уже отключил копирование с помощью -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
должен быть инициализирован этим временным объектом?
Зачем
test instance = {1,2}
не вызывает конструктор копирования или конструктор перемещения?
Это не должно test instance = {1,2}
является копирование списка инициализация, как эффект, соответствующий конструктор (т.е. test::test(int, int)
) используется для построения объекта instance
непосредственно. Нет необходимости создавать временный и вызывать конструктор копирования / перемещения здесь.
ХОРОШО. Я добавляю дополнительную информацию здесь.
: Копировать инициализацию, Инициализация списка.
Так T object = {other}
действительно копировать инициализацию до C ++ 11, которые рассматривают его как инициализацию списка.