Допустим, у меня есть несколько объявленных локально объектов, которые я хочу перебрать, используя синтаксис на основе диапазона.Это, кажется, работает хорошо, однако, кажется, что для помещения локальных объектов в initializer_list, выполняется копия.Это плохие новости для таких объектов, как std::shared_ptr
, для которых (как я понимаю) увеличение счетчика ссылок является атомарной операцией.Единственный способ, как я думаю, этого можно избежать, используя необработанные указатели.
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> ptrInt1 = std::make_shared<int>(1);
std::shared_ptr<int> ptrInt2 = std::make_shared<int>(2);
/* in this loop, ptrInt1 and ptrInt2 are copied before they are binded
to ptrInt, this is ugly since the reference counter needs to temporarily
increased */
for(const std::shared_ptr<int>& ptrInt : {ptrInt1, ptrInt2}) {
std::cerr << *ptrInt << std::endl;
}
/* this solution works, but it feels somewhat ugly having to convert my smart
pointers to raw pointers to avoid the copying, perhaps there is a better
solution ?? */
for(const int* rawPtrInt : {ptrInt1.get(), ptrInt2.get()}) {
std::cerr << *rawPtrInt << std::endl;
}
return 0;
}
Есть ли способ перебора группы локально объявленных объектов без их копирования или использования необработанных указателей?