C++ 填充另一个容器时,从一个容器迭代时是否需要执行条目的副本?
当我有这样一个函数时:C++ 填充另一个容器时,从一个容器迭代时是否需要执行条目的副本?,c++,C++,当我有这样一个函数时: std::vector<std::experimental::filesystem::directory_entry> Foo(const std::string& start) { std::vector<std::experimental::filesystem::directory_entry> result; auto paths = std::experimental::filesystem::directory
std::vector<std::experimental::filesystem::directory_entry> Foo(const std::string& start)
{
std::vector<std::experimental::filesystem::directory_entry> result;
auto paths = std::experimental::filesystem::directory_iterator(start);
for (auto& d : paths) {
if (IsDirectory(d)) {
result.push_back(d);
}
}
return result;
}
在使用auto d而不是auto&d迭代paths集合时,是否需要执行目录项的副本
我的直觉是这样的:
迭代路径时,返回std::experimental::filesystem::v1::directory\u条目和类型的引用。
然后我将其传递给向量,该向量的push_back具有以下签名:void push_back const value_type&val
我想这意味着在我从函数返回一个向量之后,它将包含引用已经被回收的内存的元素,因此我遇到了麻烦
所以问题是:我必须用auto d替换它,还是我遗漏了什么?不,push_back会复制一个对象以获得该对象的所有权
只要向量被声明为包含对象,无论您可以使用引用、常量引用或对象推回,该向量将始终存储对象,而不存储引用。…还是我遗漏了什么。。。是的,回推签名中的常量。vector不存储引用。