2014-10-07 33 views
-1

是否可以使用QMap< QString, boost::multi_index_container<...> >這樣的結構?boost :: multi_index_container在QMap中

一方面,我們在容器聲明中有private: BOOST_COPYABLE_AND_MOVABLE(multi_index_container) 。它應該告訴我們不要將multi_index_container <>放入其他類似stl的容器中。

在另一方面,這種結構

QMap< QString, boost::multi_index_container<...> > _map; 
map.insert("bla-bla", container1); 
... 
auto tmp = _map.value(QString("bla-bla")).get<keyVal>(); 
//keyVal corresponds to one for the multi_index_container instance 

與Visual Studio 2012(+ UPDATE4 +升壓v1.55 + QT v4.8.5)編譯好。

實驗人們發現:

auto tmp = _map.value(QString("bla-bla")).get<keyVal>(); 

使得tmp處理刪除的數據。 而

auto tmp = _map.value(QString("bla-bla")); 
auto tmp_1 = tmp.get<keyVal>(); 

tmp_1有效數據。

有沒有人知道如果我們需要把它放在另一個容器中,boost::multi_index_container<>的適當處理是什麼?

Qt5.3有什麼不同嗎?

+0

_「通過實驗發現」_編譯器會很高興地編譯你的[Undefined Behavior]()。絕大多數此類情況下,它們不需要發出診斷消息。 – sehe 2014-10-07 17:25:43

回答

3

正如你可以在文檔的QMAP看到:

const T QMap::value(const Key & key, const T & defaultValue = T()) const 

值由返回值,而不是引用。除了對大數值非常低效(比如多索引容器,也許?),它也會返回一個臨時值。現在

get<keyVal>();確實返回到第一索引,參考它是一個屬於暫時的,其中模具在方含全表達的末尾。


要獲得修改的參考,使用

T & QMap::operator[](const Key & key) 

現在,您可以:

auto& tmp = _map[QString("bla-bla")].get<keyVal>(); 

注意&

1

添加到@ sehe的回答如何檢索引用而不是臨時值,boost::multi_index_containercopyable and movable。您引用的這個​​宏必須放在類專用部分(如指定的here),但不影響複製/移動視圖的可見性。故事的道德:在深入研究代碼之前諮詢文檔。

+0

對不起,這篇文章是downvoted。我認爲OP是新的SO。從我+1。 – sehe 2014-10-08 14:54:47

+0

謝謝@sehe!並不是說我太在乎我的聲望:-)我唯一的動機是試圖幫助人們使用我的庫。 – 2014-10-08 16:16:48

-4

在我的特殊情況下,問題是編譯器使用const T operator[](const Key & key) const而不是T & operator[](const Key & key),因爲該類的方法是const之一,並且地圖是該類的一個字段。

+3

這不是一個答案,你問題中的代碼沒有這樣的問題,你的類型都是由'auto'推導出來的。你問的問題是你的** [未定義的行爲]()**(「讓'tmp'來處理已刪除的數據」),我在我的回答中解釋過。如果在解決這個問題後,你解決了不相關的事情**,那麼這與你無關。 – sehe 2014-10-08 14:49:06

+0

這個問題不是關於未定義的行爲。問題是關於使用boost :: multi_index_container實例作爲QMap值的特殊情況。所以我的回答完全涉及到這個問題。 作爲一個額外的問題我已經問了一些關於boost :: multi_index_container實現的信息。因此,儘管引用文檔總是有用的,但與問題沒有直接關係。通過auto推斷類型不是問題的根源,所以您的評論不具有建設性。 – 2014-10-08 18:17:06

+0

「使tmp處理刪除的數據」和「是否有人知道什麼是正確的處理方式」對於UB是完全**,並且實際上對於multi_index沒有任何**。你會遇到與使用'auto tmp = map.value(QString(「keyname」))的QMap 完全相同的問題(未定義行爲)。c_str()' – sehe 2014-10-08 19:21:05

相關問題