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
、関数内で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)
}
ポインタを渡さなかった場合、動作する方法はありませんsame_params< int const & >
。