考慮下面的代碼:爲什麼調用複製構造函數而不是移動構造函數?
class Outer
{
class Inner
{
public:
Inner(Inner&& i):outers(std::move(i.outers)),test(std::move(test))
{}
void addOuter(const Outer& o) {outers.push_back(std::move(o));}
private:
std::vector<Outer> outers;
std::unique_ptr<std::string> test;
};
public:
Outer(Outer&& o):inners(std::move(o.inners))
{}
private:
std::vector<Inner> inners;
};
當我嘗試編譯上面的代碼上的Visual Studio 2012,我得到以下錯誤:
Error 1 error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
顯然,編譯器調用拷貝構造函數,而不是在addOuter
方法中找到的push_back中的移動構造函數。這是一個編譯器錯誤?如果沒有,爲什麼,對於這個特定的情況,是不是移動構造函數調用?
可能是因爲'o'作爲'addOuter'的'const'引用傳遞。 –
@Andrey這應該是一個答案。 – Angew
它看起來像你需要一個'void addOuter(Outer && o){outers.push_back(std :: move(o));}'overload – juanchopanza