2016-07-03 46 views
3

我在寫一些代碼,它有一個通用容器,要求元素爲nothrow_move_constructible爲什麼`boost :: container :: flat_set`不是`nothrow_move_constructible`?

我決定添加一個static_assert來強制執行此操作,以防萬一。

當我使用boost::container::flat_set時,我現在無法編譯。

我認爲這只是一個疏忽,我需要一個更近的提升verison,但似乎實際上他們故意使其不能安全地移動:

在這裏看到的文檔:

http://www.boost.org/doc/libs/1_61_0/doc/html/boost/container/flat_set.html

您可以看到他們確實更新了它以使用R值參考並將swap標記爲noexcept,但他們選擇不進行移動。 看來,移動任務是有條件的noexcept。該條件似乎取決於值類型和分配器在某種程度上。

什麼可能是不可移動可構造的理由?這只是一個疏忽嗎?

+0

注意:我在這裏打開了一張票:https://svn.boost.org/trac/boost/ticket/12319 –

+0

注意:維護人員已經打了補丁,看到了機票:) –

回答

2

如果容器內的物體不是nothrow_move_constructible,那麼在一定條件下(通常涉及分配器)取一整套一個容器並將其重新定位到另一個容器是非常危險的。如果兩個容器沒有使用相同的分配器構建,那麼將內存從一個容器移動到另一個容器已經不再安全(認爲兩個容器來自兩個不同的內存區域)。

到電流源挖掘,無論是合同和執行是有問題的:

//! <b>Effects</b>: Move constructs a flat_map. 
//! Constructs *this using x's resources. 
flat_map(BOOST_RV_REF(flat_map) x) 
    : m_flat_tree(boost::move(x.m_flat_tree)) 
{ ... } 

所以你當前的期望,它可以由目前nothrow是正確的。但他們在做什麼可能是不對的。

我只能猜測他們擔心他們將來不得不重新考慮這個問題,並且不希望稍後再削弱nothrow合同。

+0

我挖了一些這個。我想成爲'noexcept'的人與分配者無關:這只是這個人:http://www.boost.org/doc/libs/1_61_0/doc/html/boost/container/flat_set.html #idp16638336-bb,他被指定爲不變的複雜性。所以我想他沒有理由不'不接受'。 –

相關問題