2013-07-10 28 views
2

爲了決定在後C + 11x時代支持定製版本的交換是否合理,我想知道哪些std函數調用了交換,並且他們仍然會從用戶實現的版本中受益,即使存在移動構造函數和移動賦值?哪些std函數調用交換函數的用戶實現版本?

+0

你總是可以分析代碼,看看是否交換是一個熱點。 –

+0

我認爲標準庫*要求的類型是可交換的(比標準庫的實現實際調用交換的地方更重要)。這可以通過搜索標準(或草稿)中的術語「可交換」來輕鬆找到。 – dyp

回答

2

我不認爲標準庫將調用您的交換功能,

標準庫將調用你的那些地方swap實現它需要的類型是交換,例如在執行std::pair<>::swap。除此之外,其他代碼也可能使用您的swap來實現它們自己的swap函數。對於這些情況,如果您已經實現了移動構造函數和移動賦值,則標準實現std::swap應爲,但不要求(AFAIK)使用移動構造函數/賦值。

swap對於已經實現了移動操作的類型的實施是一個三線的功能,所以我會繼續前進,反正實現:

void swap(mytype& lhs, mytype& rhs) { 
    mytype tmp(std::move(lhs)); 
    lhs = std::move(rhs); 
    rhs = std::move(tmp); 
} 
+1

這不是Cx11的默認實現嗎?所以不需要這樣實現=) – Thorsten

+0

@Thorsten [utility.swap]不包含*必需的*實現(並且沒有「默認」一個;我甚至會說標準中沒有默認實現,只是示例實現或所需的影響)。 – dyp

+0

@DyP:MoveConstructible不需要存在移動構造函數或者它被使用。可複製類型是可移植的(可移動但不可複製也是可移植的)。在C++ 11編譯器中,對於可複製類型的'std :: swap'完全有效的實現是從相同編譯器的C++ 98版本實現'std :: swap'。 –

相關問題