考慮這個代碼的假設是一個結構有一些國家和int state
標誌,這種狀態是任何複雜的:不可移動的結構?
struct Object
{
private:
int state = 0;
public:
Object(Object&& other):
state(std::move(other.state))
{}
};
struct ReferencingObject
{
private:
Object& object;
int state = 0;
public:
ReferencingObject(Object& object):
object(object)
{}
ReferencingObject(ReferencingObject&& other):
object(other.object),
state(std::move(other.state))
{}
};
struct CannotMove
{
Object object;
ReferencingObject ref;
CannotMove():
object(),
ref(object)
{}
CannotMove(CannotMove&& other):
object(std::move(other.object)),
ref(std::move(other.ref))
{}
};
1)着眼於CannotMove(CannotMove&&)
移動構造函數,我認爲我目前的實施是錯誤的,因爲移動ReferencingObject
實例保持對現在未定義的Object
實例的引用,因爲它已經移動。但是,由於ReferencingObject
結構體包含它自己的狀態,我的結論是CannotMove
不存在正確的移動構造函數。我的結論是否正確?
2)現在假設我從1)得出的結論是正確的,並且CannotMove
是一個相當複雜的模板類。複雜,以至於獲得實例(但從用戶的角度)的唯一合理的方法是通過使用auto
,如:
auto cannotMoveInstance = createCannotMove();
的createCannotMove()
功能可以寫的方式,將允許編譯器執行copy elision並從1)完全解決這個問題。但是,爲了防止代碼的用戶意外地移動CannotMove
的實例,應將移動構造函數標記爲已刪除。但是,這會阻止編譯器使用複製elision。我是不是被迫放棄的auto
使用和直接通過
CannotMove instance;
創建我的實例?
編輯1:Object
和ReferencingObject
的數據成員爲私有,以更好地反映典型的OOP編程。
'std :: move()''int'沒有意義。 – 2014-09-13 20:53:49
「CannotMove不存在正確的移動構造函數,我的結論是否正確?」如果你不解釋這個班應該做什麼,怎麼會有人回答這個問題? – 2014-09-13 20:59:25
@ T.C .:我知道,因此我的問題中的第一句話 – 2014-09-13 21:17:05