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不存储引用。