2011-09-08 86 views
6

有什麼地方可以確認嗎?我不確定這是GCC還是我的代碼問題。例如,下面的代碼不能編譯:GCC 4.4/4.5 unique_ptr不適用於unordered_set/unordered_map

#include <unordered_set> 
#include <memory> 
using namespace std; 

int main() { 
    unordered_set<unique_ptr<int> > s; 
    unique_ptr<int> p(new int(0)); 
    s.insert(move(p)); 
    return 0; 
} 

錯誤消息太大,我不想放在這裏。 GCC版本是4.5.3,編譯標誌是-std = gnu ++ 0x。還在4.4.5上進行了測試。

+0

這可能是因爲'std :: hash'沒有專門用於'std :: unique_ptr'。 – Mankarse

+1

@Mankarse這裏有一個專門的知識,但是它出現在20.7.2.6智能指針哈希支持[util.smartptr.hash](n3290)之後,它就出現在'std :: shared_ptr'的規範之後,有點遠離'std :: unique_ptr'。 –

+0

N.B.你應該說'std :: move'不是'move',你不希望ADL找到不同的函數。 –

回答

4

您的代碼是正確的。這是GCC 4.5中的一個已知問題。它已在4.6中修復。見http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436。它也影響有序容器(std :: map,std :: set等)。可能最簡單的解決方法(輕微的性能損失)是使用std :: shared_ptr而不是std :: unique_ptr。

8

GCC 4.6.1按原樣接受你的代碼,並且我發現它沒有任何問題(即關聯容器的value_type必須是EmplaceInsertable,並且std::unique_ptr不能阻止這種情況)。據推測,這是GCC 4.5中的一個缺陷。

3

我可以確認這是GCC 4.4.5的問題。試圖插入的unique_ptr到的std ::設置結果,其中提到了一個事實,即在STL的一些功能,試圖複製的unique_ptr長的編譯器錯誤消息:

error: deleted function [unique_ptr's copy ctor]... used here [g++-v4/bits/stl_tree.h:136].

有問題的STL功能的一部分幾個STL類的內部樹結構,包括std :: set。它也在「__GXX_EXPERIMENTAL_CXX0X__」ifdef中,這大概意味着GCC 4.4不會正式支持我們正在嘗試做的事情。

如果你不想升級到GCC 4.6,你總是可以包裝一個std :: vector,並在代碼中的某些位置策略性地檢查並刪除重複項。

相關問題