2012-04-28 2 views
2

Синтаксис списка STL :: вставка ниже -Параметров в список STL :: вставить

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

Почему итератора вместо ссылки на итератор это передается?

+1

В качестве альтернативы, почему бы и нет? –

+1

Итераторы условно передаются по значению в C++, а не по ссылке. Я не знаю, где это соглашение возникло. – templatetypedef

+0

@KerrekSB Причина, по которой я спросил об этом, потому что обычно ссылка на константу предпочтительнее избегать временных (и конструкторов копирования). Но, как упоминает templatetypedef - это по соглашению, и Potatoswatter объясняет в комментариях ниже, что компилятор оптимизирует вызов, возможно, это говорит о соглашении. Или есть что-то еще? Благодарю. – nightlytrails

ответ

1

Реализации будет разрешено передавать итератор по ссылке const вместо значения. Не существует существенной семантической разницы.

Пропуск по значению в этом случае немного более эффективен. Объект iterator содержит один указатель на объект элемента списка в куче. Помните, что передача по ссылке по существу проходит по указателю, за кулисами. (Хотя ссылка не такие же, как указатель, при пересечении фактической границы вызова функции, не существует никакой другой жизнеспособная реализации.)

Таким образом, передача по значению означает, что указатель на кучу получает прошел, но передача по ссылке означает, что передается указатель-to-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

Если weren» t, проходящих указатели, нет возможности для работы same_params< int const & >.

 Смежные вопросы

  • Нет связанных вопросов^_^