Раньше я предполагал, что конструкторам перемещения класса будет отдан приоритет над конструкторами копирования, но в приведенном ниже коде кажется, что конструктор копирования выбран, даже если объект должен быть перемещаемым.
Do вы понимаете, почему нижеприведенные коды выбирают конструктор копирования, когда foo()
возвращает vector<B> B
?
#include <iostream>
#include <vector>
using namespace std;
class B {
public:
int var_;
B(int var) : var_(var)
{
cout << "I'm normal" << endl;
}
B(const B& other)
{
cout << "I'm copy constructor" << endl;
}
B(B&& other)
{
cout << "I'm move constructor" << endl;
}
};
vector<B> foo()
{
vector<B> b;
b.push_back(1);
b.push_back(2);
return b;
}
int main()
{
vector<B> b {foo()};
}
Результат такой, как показано ниже.
$ g++ main.cpp
$ a.out
I'm normal
I'm move constructor
I'm normal
I'm move constructor
I'm copy constructor
Любопытно, если я удалю его в строке foo()
вместо этого выбирается конструктор перемещения:
vector<B> foo()
{
vector<B> b;
b.push_back(1);
return b;
}
Теперь результат такой, как показано ниже:
$ g++ main.cpp
$ a.out
I'm normal
I'm move constructor