2012-04-28 6 views
2

にSTLリストの構文を挿入::インサートは以下の通りです -パラメータ::

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

代わりにイテレータへ参照のイテレータが渡されているのはなぜ?

+1

また、どうしてですか? –

+1

反復子は、通常、参照ではなくC++で値渡しされます。しかし、このコンベンションがどこで起こったのか分かりません。 – templatetypedef

+0

@KerrekSB私はこれを尋ねた理由は通常、一時的な(およびコンストラクタのコピーを避けるために)constへの参照が優先されるためです。しかしtemplatetypedefが言及しているように、これは慣習であり、Potatoswatterは以下のコメントでコンパイラが呼び出しを最適化していると説明しています。それとももっと何かありますか?ありがとう。 – nightlytrails

答えて

1

実装では、イテレータを値ではなくconst参照で渡すことができます。関連する意味的な違いはありません。

この場合、値渡しはやや効率的です。 iteratorオブジェクトには、ヒープ上のリスト要素オブジェクトへの単一のポインタが含まれています。参照渡しは本質的にポインタの後ろを舞台に回ることを覚えておいてください。 (参照はではなく、ではなく、実際の関数呼び出しの境界を越えるときには他の実行可能な実装はありません。)したがって、値渡しはヒープへのポインタが渡されることを意味しますが、参照を渡すと、iteratorへのポインタが渡され、次にinsert関数内で2つの間接が必要になります。 (これは、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

はそれがwerenが」ポインタを渡すと、same_params< int const & >が機能する方法はありません。