在Herb Sutter的2014 CppCon演讲中,他谈到如果你不打算转让或分享所有权,你不应该在函数声明中使用智能指针。最明确的是,不能使用const引用智能指针。
如果我有一个函数,它接受一个智能指针指向的元素,这很容易实现。你只需要:
void f(int& i) //or int*
{
i++;
}
int main()
{
auto numberPtr = std::make_unique<int>(42);
f(*numberPtr);
}
但是我想知道的是,是否有基于范围的循环的最佳实践?
int main()
{
auto numberPtrVec = std::vector<std::unique_ptr<int>>{};
for(int i = 0; i < 5; i++)
numberPtrVec.push_back(std::make_unique<int>(i));
for(auto& i : numberPtrVec)
{
//i++; would be the optimum
(*i)++; //dereferencing is necessary because i is still a reference to an unique_ptr
}
}
是否有办法直接捕获当前元素作为引用或原始指针?
对于我来说,处理对智能指针的引用总是感觉有点不对。
在for
-循环中获取一个引用作为第一项业务:
for(auto& i : numberPtrVec)
{
auto &n = *i;
,然后在循环的其余部分使用n
。
在c++ 20中,我建议使用std::ranges::transform(deref)
,其中deref
是std::plus
风格的操作符包装器。
对于c++ 17,您需要一个range库,例如range-v3的views::indirect
:
#include <range/v3/view/indirect.hpp>
for(auto& i : numberPtrVec | ranges::views::indirect)
{
i++;
}