2012-04-28 49 views
2

STL列表的語法::刀片是如下 -參數爲STL目錄::插入

iterator 
    insert(iterator __position, const value_type& __x); 

爲什麼迭代而不是參考迭代器被傳遞?

+1

或者,爲什麼不呢? – 2012-04-28 22:22:49

+1

迭代器通常按C++中的值傳遞,而不是通過引用傳遞。不過,我不確定這個約定是在哪裏產生的。 – templatetypedef 2012-04-28 22:22:54

+0

@KerrekSB我問這個的原因是因爲通常對const的引用是避免臨時對象(和複製構造函數)的首選。但是,正如templatetypedef所提到的 - 這是按照慣例,Potatoswatter在下面的評論中解釋說編譯器優化了這個調用,可能是爲了約定。或者還有什麼更多呢?謝謝。 – nightlytrails 2012-04-29 00:48:24

回答

1

實現將被允許通過const引用而不是按值傳遞迭代器。沒有相關的語義差異。

在這種情況下,通過值傳遞效率稍高。 iterator對象包含指向堆上的列表元素對象的單個指針。請記住,通過引用傳遞本質上是在指針後面傳遞。 (儘管參考是相同的指針,交叉的實際函數調用邊界時,不存在其他可行的實施方式。)

所以,通過由值意味着指針到堆被傳遞,但經過引用意味着指針到iterator通過,然後在insert函數中需要兩個間接指針。 (這確實在理論上取決於ABI,但無論如何不能有一個缺點按值傳遞。)

快速說明經過語義:

template< typename param > 
void same_params(param a, param b) { 
    std::cout << (&a == &b) << '\n'; 
} 

int main() { 
    int const five = 5; 
    same_params< int const & >(five, five); // true 
    same_params< int const & >(five, 6); // false 
    same_params< int const & >(five, 5); // unspecified 
    same_params< int const & >(5, 5); // unspecified 

    same_params<int>(five, five); // false (for any arguments) 
} 

http://ideone.com/2mC07

如果間沒有」通過指針,same_params< int const & >無法工作。