2

STL list::insertの構文は次のとおりです-

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

イテレータへの参照ではなくイテレータが渡されるのはなぜですか?

4

1 に答える 1

1

実装は、値ではなくconst参照によってイテレータを渡すことができます。関連するセマンティックディファレンスはありません。

この場合、値を渡す方が少し効率的です。オブジェクトには、ヒープ上のリスト要素オブジェクトへのiterator単一のポインターが含まれています。参照による受け渡しは、基本的に、舞台裏でのポインタによる受け渡しであることを忘れないでください。(参照はポインターと同じではありませんが、実際の関数呼び出しの境界を越える場合、他の実行可能な実装はありません。)

したがって、値の受け渡しはヒープへのポインタが渡されることを意味しますが、参照の受け渡しはポインタからヒープへの受け渡しを意味しiterator、関数内で2つの間接参照が必要になり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 & >

于 2012-04-29T00:50:00.593 に答える