STL list :: insert的参数

时间:2012-04-28 22:20:03

标签: c++ stl iterator pass-by-value

STL list :: insert的语法如下 -

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

为什么传递迭代器而不是对迭代器的引用

1 个答案:

答案 0 :(得分: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 & >无法工作。