Синтаксис списка STL :: вставка ниже -Параметров в список STL :: вставить
iterator
insert(iterator __position, const value_type& __x);
Почему итератора вместо ссылки на итератор это передается?
Синтаксис списка STL :: вставка ниже -Параметров в список STL :: вставить
iterator
insert(iterator __position, const value_type& __x);
Почему итератора вместо ссылки на итератор это передается?
Реализации будет разрешено передавать итератор по ссылке 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)
}
Если weren» t, проходящих указатели, нет возможности для работы same_params< int const & >
.
В качестве альтернативы, почему бы и нет? –
Итераторы условно передаются по значению в C++, а не по ссылке. Я не знаю, где это соглашение возникло. – templatetypedef
@KerrekSB Причина, по которой я спросил об этом, потому что обычно ссылка на константу предпочтительнее избегать временных (и конструкторов копирования). Но, как упоминает templatetypedef - это по соглашению, и Potatoswatter объясняет в комментариях ниже, что компилятор оптимизирует вызов, возможно, это говорит о соглашении. Или есть что-то еще? Благодарю. – nightlytrails