c++ - Initializer_list 作为函数参数和函数中的循环

标签 c++ c++11

我是新来的,这是我的第一个问题。

所以,我有这个功能:

std::string join(string_initializer_list p_input) const {
    std::string output;
    for (auto const & s : p_input) {
        output.append(s);
    }
    return output;
}

该函数的主要目标是加入一个字符串列表并返回一个新字符串。

对于参数,我使用了 std::initializer_list<std::string>别名为 string_initializer_list .

参数是按值传递的,因为在做了一些研究之后,我注意到我只是在传递指针,这是最惯用和最正确的方法。

我的问题与 for 循环有关:在这种情况下哪个更正确,为什么?我应该使用 auto const & 吗?或 auto &&

问题是:我不想更改 initializer_list 中的任何字符串,我想清楚这一点。从那个角度来看const &似乎更正确,但我想知道您对此事的看法。

在做了一些研究、用 C++ 测试它并阅读了这里的大量问题之后,我还没有完全理解 auto && 是如何做到的。有效。

此外,在初稿中,我还将参数作为 && 传递作为一种防止它成为左值的方法。

我打算只将此功能用于像这样的快速操作:

join({"Hello, ", "world"});

在极少数情况下,其中之一 std::string s 最终将成为一个左值:

join({"Hello, ", some_string});

这里的主要概念是制作一种廉价且简单的连接字符串的方法。这是我制作的另一个功能,与上面的功能类似,但适用于不同的上下文。

std::string & concatenate(std::string & p_output, string_initializer_list p_input) const {
    for (auto const & s : p_input) {
        p_output.append(s);
    }
    return p_output;
}

再一次,我这个完美主义者在问关于 for 循环的问题。

最佳答案

std::initializer_list<T> 的迭代器类型是const T* .所以当你取消引用它时,你会得到一个 const T 类型的左值。 .是否使用const auto&并不重要或 auto&&进行迭代,因为无论哪种方式,您都将获得对 const T 的左值引用.我更喜欢 const auto&这里是为了便于阅读--- auto&&通常建议您使用模板代码,其中事物可以是左值或右值。

关于c++ - Initializer_list 作为函数参数和函数中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40756521/

相关文章:

c++ - sprintf - 字符串前有 4 个无用的 ascii 字符

c++ - MFCreateAggregateSource 是否对排序做出任何保证?

c++ - 如何使用 C++11 线程功能同步 2 个函数?

c++11 - 使用 std::bind 与 lambda 进行绑定(bind)。它们有多贵?

c++ - 无法使用迭代器删除 vector 元素, vector 元素实现移动构造函数

c++ - 在 C++ 中有 &func 或 class::func 的用途吗?

c++ - `static_cast<volatile void>` 对优化器意味着什么?

c++ - 在 C++11 中为嵌套循环返回 vector 的最佳实践

c++ - 添加 initializer_list 构造函数后静默中断构造函数调用

c++ - C++ 把局部变量放在哪里?