2011-10-02 145 views
4

我的目標是保證我所有變體類型的單一存儲:根據'never empty' guarantee from Boost::variant,我們需要覆蓋每個有界類型的 boost::has_nothrow_copy。但稍後 文檔中提到了一些關於'boost::blank'的內容,如果該類型被綁定,variant將設置該值,而不是嘗試不彈出 默認拷貝構造函數。boost :: variant單一存儲保證

有什麼不清楚的是,如果在有界類型列表 將避免覆蓋的要求加入的boost ::空白/專業has_nothrow_copy 與其他類型的?

回答

5

我相信這一點很清楚。下面是從升壓文檔的相關部分:

因此,變體被設計爲啓用下列優化 一次以下標準在其界類型都滿足:

對於每個有界類型T是拋出異常拷貝構造(如升壓:: has_nothrow_copy表示 ),庫保證變種 將只使用單一的存儲和就地建設T.

如果任何 界類型是無拋出缺省constructible(指示通過 boost :: has_nothrow_constructor),該庫保證變體 僅對變體中的每個有界 類型使用單個存儲和就地構造。但是,請注意,如果發生指派 失敗,則將在左側操作數中默認構造一個未指定的未指定缺省構造的有界類型 ,以便 保留永不爲空的保證。

由於boost::blank不是默認可構造的,所以第二個子句適用。而且這聽起來像是Boost專門爲這個特殊類型選擇了所有其他類型的選擇,因此,如果這是一個選項,而不是未指定哪種默認可構造類型將被實例化,那麼類型將保證爲boost::blank

+0

嗯,我必須多讀幾遍,才能感覺到我的頭骨,謝謝! – lurscher

+0

+1我正要回答這個問題!問題是45分鐘的老!該死的你! ;-) –

+0

我可以確認'std :: cout << boost :: has_nothrow_constructor :: value <<「\ n」;'輸出'1'(true)。 –