У меня есть этот класс:
class Foo {
public:
Foo() {}
Foo(const Foo&){cout << "constructed by lvalue reference." <<endl; }
Foo(Foo&& ) {cout << "constructed by rvalue reference." << endl; }
};
тогда я вставляю в вектор:
Foo foo{};
vf.push_back(foo);
Выход удивляет:
constructed by lvalue reference.
constructed by lvalue reference.
Я предполагаю, что он был скопирован при передаче параметров, поэтому я попробовал:
vf.push_back(move(foo));
и
vf.push_back(forward<Foo>(foo));
Вывод немного отличается из-за семантики перемещения, но по-прежнему вызывает конструктор дважды:
constructed by rvalue reference.
constructed by lvalue reference.
Почему конструкторы дважды вызывались? Насколько это влияет на производительность? Как я могу избежать этого?
Я использую mingw-gcc-4.7.1 в Windows Vistap >
Общий пример:
#include <iostream>
#include <vector>
using namespace std;
class Foo {
public:
Foo() {}
Foo(const Foo&){cout << "constructed by lvalue reference." <<endl; }
Foo(Foo&& ) {cout << "constructed by rvalue reference." << endl; }
};
int main(int argc, char **argv, char** envp)
{
vector<Foo> vf;
cout << "Insert a temporary." << endl;
vf.emplace_back(Foo{});
Foo foo{};
cout << "Insert a variable." << endl;
vf.emplace_back(foo);
return 0;
}
Точный выход:
Insert a temporary.
constructed by rvalue reference.
Insert a variable.
constructed by lvalue reference.
constructed by lvalue reference.