2
STL列表的語法::刀片是如下 -參數爲STL目錄::插入
iterator
insert(iterator __position, const value_type& __x);
爲什麼迭代而不是參考迭代器被傳遞?
STL列表的語法::刀片是如下 -參數爲STL目錄::插入
iterator
insert(iterator __position, const value_type& __x);
爲什麼迭代而不是參考迭代器被傳遞?
實現將被允許通過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)
}
如果間沒有」通過指針,same_params< int const & >
無法工作。
或者,爲什麼不呢? – 2012-04-28 22:22:49
迭代器通常按C++中的值傳遞,而不是通過引用傳遞。不過,我不確定這個約定是在哪裏產生的。 – templatetypedef 2012-04-28 22:22:54
@KerrekSB我問這個的原因是因爲通常對const的引用是避免臨時對象(和複製構造函數)的首選。但是,正如templatetypedef所提到的 - 這是按照慣例,Potatoswatter在下面的評論中解釋說編譯器優化了這個調用,可能是爲了約定。或者還有什麼更多呢?謝謝。 – nightlytrails 2012-04-29 00:48:24