С++ 11
У меня проблемы с использованием конструктора перемещения. У меня есть простой класс-контейнер с именем Number
, единственным элементом данных которого является целое число. У меня есть следующий код:
//Number.h
#ifndef NUMBER_H
#define NUMBER_H
#include <iostream>
class Number
{
public:
Number();
Number(int ipar);
Number(const Number& src);
Number(Number&& src);
private:
int num;
};
#endif
и
//Number.cpp
#include "Number.h"
Number::Number()
{
std::cout << "default ctor" << std::endl;
}
Number::Number(int ipar) : num(ipar)
{
std::cout << "integer argument ctor" << std::endl;
}
Number::Number(const Number& src) : num(src.num)
{
std::cout << "copy ctor" << std::endl;
}
Number::Number(Number&& src) : num(src.num)
{
std::cout << "move ctor" << std::endl;
}
и
//main.cpp
#include "Number.h"
using namespace std;
int main()
{
cout << "Part A:" << endl;
Number n1(1);
cout << "Part B:" << endl;
Number n2(n1);
cout << "Part C:" << endl;
Number n3{Number{n1}};
cout << "Part D:" << endl;
Number n4(Number(n1));
return 0;
}
Вывод:
Part A:
integer argument ctor
Part B:
copy ctor
Part C:
copy ctor
Part D:
Обратите внимание, что для части D нет выходных данных. Я ожидал, что выходные данные для частей A и B будут такими, какие я ожидал, а для других — нет.
Я ожидал этого для частей C и D:
Part C:
copy ctor
move ctor
Part D:
copy ctor
move ctor
Ожидание части C:
Я ожидал, что Number{n1}
часть Number n3{Number{n1}}
создаст временный безымянный объект Number
, потому что между Number
и открывающей фигурной скобкой нет имени, вызвав конструктор копирования с n1
. Затем я ожидал, что Number n3
будет создан путем вызова конструктора перемещения с временным объектом.
Ожидание части D:
Поскольку это похоже на часть C, за исключением того, что вместо фигурных скобок используются круглые скобки, я ожидал, что эта часть будет вести себя и выводиться так же, как я ожидал от части C.
Вопрос:
Почему фактический результат отличается от моих ожиданий и как правильно получить желаемый результат?
Примечание. Если вы хотите скомпилировать это в Visual Studio, вам потребуется Компилятор Visual C++, ноябрь 2012 г., CTP или более поздняя версия для Visual Studio 2012, чтобы поддерживать единый синтаксис инициализации.