什么構(gòu)成C ++ 11中“移動”對象的有效狀態(tài)?我一直在試圖解決C ++ 11中的移動語義應(yīng)該如何工作,而且我很難理解移動對象需要滿足的條件??纯催@里的答案并沒有真正解決我的問題,因為無法看到如何以合理的方式將它應(yīng)用于pimpl對象,盡管移動語義的參數(shù)非常適合pimpls。我的問題最簡單的說明涉及pimpl習(xí)語,如下所示:class Foo {
std::unique_ptr<FooImpl> impl_;public:
// Inlining FooImpl's constructors for brevity's sake; otherwise it
// defeats the point.
Foo() : impl_(new FooImpl()) {}
Foo(const Foo & rhs) : impl_(new FooImpl(*rhs.impl_)) {}
Foo(Foo && rhs) : impl_(std::move(rhs.impl_)) {}
Foo & operator=(Foo rhs)
{
std::swap(impl_, rhs.impl_);
return *this;
}
void do_stuff ()
{
impl_->do_stuff;
}};現(xiàn)在,一旦我離開了,我該怎么辦Foo?我可以安全地銷毀移動的物體,我可以分配給它,這兩者都絕對是至關(guān)重要的。但是,如果我嘗試do_stuff使用我的Foo,它會爆炸。在我為我的定義添加移動語義之前Foo,每個人都Foo滿足了它的不變性do_stuff,而現(xiàn)在已不再是這樣了。似乎沒有很多很好的替代方案,因為(例如)將移動放入Foo將涉及新的動態(tài)分配,這部分地違背了移動語義的目的。我可以檢查是否impl_輸入do_stuff并將其初始化為默認(rèn)值FooImpl 如果是,但是這會增加(通常是假的)檢查,如果我有很多方法,那就意味著要記住每一個檢查。我應(yīng)該放棄能夠do_stuff成為合理的不變量的想法嗎?
2 回答

絕地?zé)o雙
TA貢獻(xiàn)1946條經(jīng)驗 獲得超4個贊
但是,如果我嘗試用我的Foo do_stuff,它會爆炸。
是。這樣:
vector<int> first = {3, 5, 6};vector<int> second = std::move(first);first.size(); //Value returned is undefined. May be 0, may not
標(biāo)準(zhǔn)使用的規(guī)則是將對象保留為有效(意味著對象有效)但未指定狀態(tài)。這意味著您可以調(diào)用的唯一函數(shù)是那些對對象的當(dāng)前狀態(tài)沒有條件的函數(shù)。對于vector
,您可以使用它的復(fù)制/移動賦值運算符,以及clear
和empty
等幾個操作。所以你可以這樣做:
vector<int> first = {3, 5, 6};vector<int> second = std::move(first);first.clear(); //Cause the vector to become empty.first.size(); //Now the value is guaranteed to be 0.
對于您的情況,復(fù)制/移動分配(從任何一方)應(yīng)該仍然有效,析構(gòu)函數(shù)也應(yīng)如此。但是你的所有其他功能都有一個基于未被移動的狀態(tài)的前提條件。
所以我沒有看到你的問題。
如果你想確保沒有Pimpl'd類的實例可以為空,那么你將實現(xiàn)適當(dāng)?shù)膹?fù)制語義并禁止移動。運動需要物體處于空狀態(tài)的可能性。
- 2 回答
- 0 關(guān)注
- 465 瀏覽
添加回答
舉報
0/150
提交
取消