C++:将字符串作为常量引用是否经常被认为是一种好习惯?

ken*_*ent 5 c++ c++14

这是我的 C++ 代码中的一个片段:

std::queue<std::string> get_file_names(const std::string &indir)
{
    std::queue<std::string> file_names;

    fs::recursive_directory_iterator end;
    for (fs::recursive_directory_iterator it(indir); it != end; it++) {
        const std::string &extn = it->path().extension().string();
        if (extn == ".zip") {
            const std::string &file_name = it->path().string();
            file_names.push(file_name);
        }
    }

    return file_names;
}
Run Code Online (Sandbox Code Playgroud)

使每个字符串都不会修改 const 引用是一个好习惯吗?我无法理解在这种情况下如何存在这样的参考。就像it->path().string()上面的返回值一样。当推回向量时,如何将其分配给以后可以在函数范围之外使用的引用?

我觉得它必须与std::move.

Ðаn*_*Ðаn 5

你的代码:

const std::string &file_name = it->path().string();
Run Code Online (Sandbox Code Playgroud)

std::string延长所返回的临时变量的生命周期std::filesystem::path::string()。由于您已将其标记为const,因此无法将其移至file_names,因此必须将其复制。假设你想要移动,你会写:

auto&& file_name = // ...
file_names.push(std::move(file_name));
Run Code Online (Sandbox Code Playgroud)

请注意,std::queue有一个push()右值引用

现代 C++ 为编译器提供了很多优化机会,因此避免有关悬空引用的问题/“混乱”(语法auto&&在 C++11 中是“新的”)可能是更好的方法:

auto file_name = // ...
file_names.push(std::move(file_name));
Run Code Online (Sandbox Code Playgroud)

编写“看起来和行为都像ints”的“自然”代码通常是一个好方法。在不太可能的情况下,您发现这确实是性能瓶颈,您可以重新审视;首先为了清晰起见编写代码。