【问题标题】:Parameters to STL list::insertSTL list::insert 的参数
【发布时间】:2012-05-09 05:31:54
【问题描述】:

STL list::insert 的语法如下-

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

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

【问题讨论】:

  • 迭代器在 C++ 中通常按值传递,而不是按引用传递。不过,我不确定这个约定是从哪里产生的。
  • @KerrekSB 我问这个的原因是因为通常首选对 const 的引用以避免临时(和复制构造函数)。但是正如 templatetypedef 所提到的 - 这是按照惯例,Potatoswatter 在下面的 cmets 中解释说,编译器优化了调用,这可能代表了惯例。或者还有什么更多的吗?谢谢。

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


【解决方案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&lt; int const &amp; &gt; 就无法工作。

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 2010-11-09
    • 1970-01-01
    • 2012-05-13
    • 2016-06-28
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多