Initializer_list作为函数参数和for循环函数

时间:2016-11-23 05:13:43

标签: 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将最终成为左值:

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;
}

再一次,我的完美主义者正在询问这个问题。

1 个答案:

答案 0 :(得分:1)

std::initializer_list<T>的迭代器类型为const T*。因此,当您取消引用它时,您会得到const T类型的左值。无论您使用const auto&还是auto&&进行迭代都无关紧要,因为无论哪种方式,您都会获得const T的左值引用。我希望const auto&在这里是为了便于阅读--- auto&&经常建议你使用模板代码,其中的东西可以是左值或左值。