2017-03-07 21 views
0

假設我有一個類C,唯一的目的是填寫C的某個類型的容器con_m。因此,C擁有以特定方式填寫con_m的方法。 C已填滿con我不再需要C,所以我想將con_n轉儲到另一個變量中。但是C實際上是一個仿函數,因爲con_m只能遞增填充,所以不能是填充函數的局部對象。此外,實現應該隱藏給用戶,所以他不需要在返回con_m的函數上調用std::move是否使用std :: move來轉儲成員可接受的設計?

template <class container_type> class C { 

public: 

    template <class T> void fill_some_more(const T &t) { 
    // do stuff with t filling con_m by another increment 
    } 

    container_type dump_container() { return std::move(con_m); } 

    container_type con_m; 
}; 

int main() { 
    C<std::vector<int>> c; 
    while (some_condition) { 
     c.fill_some_more(some_int); 
    } 
    auto con = c.dump_container(); 
} 

這是否適合使用std::move

+3

聽起來像'C'的方法可能更適合以容器作爲參數的獨立函數。如果首先不是會員,那麼您不會遇到將集裝箱從課堂中挖出的問題。 –

+1

似乎取決於您的移動構造函數是否將源對象留在期望的狀態 –

+0

我會說不。通常移動構造函數不需要將容器留空。 – immibis

回答

1

另外的實施應當對用戶隱藏

移動對象的內容是不一個實現細節;它是功能的一部分。通過移動對象的內容,可以使對象失去其內容,因此稍後調用的代碼需要尊重這一事實。

C++標準委員會之所以這麼做,是因爲您必須明確地使用std::move,才能讓讀取您的代碼的人員能夠知道發生了什麼。如果一個人看到c.dump_container(),他們可能會認爲傾銷是通過複製發生的。如果他們看到std::move(c).dump_container(),並且如果他們發現他們不能不能通過將其稱爲左值參考,那麼對每個參與者都很清楚c之後的狀態。

運動應該是明確的。

當然,正如Igor在評論中指出的那樣,如果這些功能是用戶提供的容器上執行的自由函數,而不是讓容器成爲某種類型的成員,則可以避免這件事。

相關問題