Initializer_list函数参数和函数中的 for 循环

Initializer_list as function parameter and for loop in function

本文关键字:函数 for 循环 参数 list Initializer      更新时间:2023-10-16

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

所以,我有这个功能:

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

该函数的主要目标是联接返回新字符串的字符串列表。

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

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

我的问题与 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;
}

再一次,我内心的完美主义者在问循环。

std::initializer_list<T>的迭代器类型是const T*。因此,当您取消引用它时,您将获得一个类型const T的左值。无论您使用const auto&还是auto&&进行迭代都没有关系,因为无论哪种方式,您都将获得对const T的左值引用。为了可读性,我更喜欢在这里const auto&---auto&&通常建议您正在使用模板代码,其中事物可以是左值或右值。