2015-11-13 3 views
2

У меня возникли проблемы с преобразованием std::list<MyType>::iterator в MyType*. У меня есть массив MyType, и, как я прокручиваю его, я вызываю void doSomething(const MyType* thing). В конце концов, я делаю это:Операция & * x создает копию?

std::list<MyType> types = ... something here ...; 
for(std::list<MyType>::const_iterator it = types.begin(), end = types.end(); it != end; ++it) { 
    doSomething(&*it); 
} 

Мой вопрос, является ли я или не создать копию памяти в MyType этой операции:

&*it 

Попытка просто передать итератор, как если бы это было указатель, или для приведения итератора к указателям, вызванным ошибками компилятора.

+0

Нет, это не так. –

ответ

7

Нет, последовательность * и & не создает копию:

  • * применяется к итератору производит ссылки
  • & применяется к опорному производит адрес оригинального

Ни один из этих двух шагов не требует копирования MyType's данные.

Примечание: При наличии перегруженного оператора & возможность, безопаснее использовать std::address_of(*it) выражение.

+0

Меня пугает, что '&' можно переопределить. Но в то же время я счастлив, что C++ ничего не боится. –

0

До тех пор, пока итератор действителен, он делает то, что хочет. И нет, он не создает копию.

0

Основываясь на том, как написан ваш код, вы создаете копию указателя, но память, на которую указывает указатель, не должна копироваться.

Сломался, вы берете объект итератора (it), вы смотрите на MyType объект, на который ссылается итератор (*it), а затем получить адрес этого объекта (&*it). Затем указатель копируется в функцию и используется по вашему желанию.

2

Одним из требований к итератору является то, что оно должно быть разборчиво - то есть *it. См. http://en.cppreference.com/w/cpp/concept/Iterator. *it возвращает ссылку или копия не указана.

Теоретически реализация может вернуть копию при использовании *it.

На практике большинство реализаций возвращают ссылку при использовании *it. Следовательно, вы, скорее всего, не увидите копии, сделанной при использовании &*it.

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