STL list::insert 的语法如下 -
iterator
insert(iterator __position, const value_type& __x);
为什么要传递迭代器而不是对迭代器的引用?
STL list::insert 的语法如下 -
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 & >
工作。