今天我發現這個代碼不工作,因爲我期望它的工作。 根據我對L值的知識,應該調用複製構造函數,而對於R值,應該選擇移動構造函數。否則,std::move
的目的實際上什麼都不做,只能投射到R值。我期待return obj
將調用複製構造函數,但它調用移動。 我知道這裏的副本是無用的,但這是關於規則的。如果我的拷貝構造函數有副作用,那就是我的情況(我知道它不應該,但從技術上說它可以 - 例如:std :: cout調用)。 有沒有什麼標準允許這種行爲?另外我怎樣才能強制複製?移動構造函數返回而不是複製
#include <iostream>
class X
{
public:
X() = default;
X(const X& r): i(r.i)
{
std::cout << "copy ctor" << std::endl;
}
X(const X&& r): i(r.i)
{
std::cout << "move ctor" << std::endl;
}
int i = 0;
};
X foo()
{
X obj;
obj.i = 10;
return obj;
}
int main()
{
X x = foo();
}
移動構造函數
移動構造函數
它實際上很奇怪,它可能默默地複製,如果你明確要求移動,並可能移動,如果你沒有:) – incognito
謝謝你的解釋 – incognito
@incognito的確。這就是爲什麼你應該仔細設計你的課程;) – Quentin