我已經測試了C++ 11中的移動語義。我用移動構造函數寫了一個類。爲什麼C++ 11移動運算符(=)的行爲不同
class DefaultConstructor
{
public:
DefaultConstructor(std::vector<int> test) :
m_vec(std::forward<std::vector<int>>(test))
{
};
DefaultConstructor(DefaultConstructor &&def) :
m_vec(std::forward<std::vector<int>>(def.m_vec))
{
}
DefaultConstructor& operator=(DefaultConstructor&& def) {
m_vec = std::move(def.m_vec);
return *this;
}
DefaultConstructor& operator=(const DefaultConstructor&) = delete;
DefaultConstructor(DefaultConstructor &) = delete;
std::vector<int> m_vec;
};
我寫了一個使用移動語義的主函數。我明白移動語義中發生了什麼,它是一個很好的工具。但是有一些行爲對我來說是無法解釋的。當我呼叫DefaultConstructor testConstructor2 = std::move(testConstructor);
的主要功能時,應該調用DefaultConstructor& operator=(DefaultConstructor&& def)
。但Visual Studio 2015調用移動構造函數。
int main()
{
std::vector<int> test = { 1, 2, 3, 4, 5 };
DefaultConstructor testConstructor(std::move(test));
DefaultConstructor testConstructor2 = std::move(testConstructor);
DefaultConstructor &testConstructor3 = DefaultConstructor({ 6, 7, 8, 9 });
DefaultConstructor testConstructor4 = std::move(testConstructor3);
swapMove(testConstructor, testConstructor2);
}
好吧,我想也許=移動運算符不再是必要的。但我嘗試了一個SwapMove函數。這個函數調用= move操作符。
template<typename T>
void swapMove(T &a, T &b)
{
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
有人可以解釋這兩個電話之間的區別究竟是什麼?不應該是電話a = std::move(b);
和DefaultConstructor testConstructor2 = std::move(testConstructor);
有相同的行爲?
'DefaultConstructor testConstructor2 = std :: move(testConstructor);'是初始化,不是賦值。 –
事先分別聲明'testConstructor2',例如'DefaultConstructor testConstructor2({});' –
Jonatha Potter看起來像這就是答案。謝謝。 – PeterNL