Initializer_list函数参数和函数中的 for 循环
Initializer_list as function parameter and for loop in function
我是新来的,这是我的第一个问题。
所以,我有这个功能:
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_list
的std::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&&
通常建议您正在使用模板代码,其中事物可以是左值或右值。
- "error: no matching function for call to"构造函数错误
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- C++函数模板需要 &for 数组参数
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- 创建函数变体向量时"No matching function for call"错误
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- 虚拟函数调用的性能作为 for 循环中的上限
- constexpr 函数中的 for 循环无法使用 MSVC 19.23 进行编译
- 函数中的"pragma omp parallel for"在另一个并行循环中调用函数时无效
- 找不到如何创建使用指针、字符和 for 函数组合的程序
- 这个基于范围的'for'语句需要一个合适的函数,但找不到任何函数
- For 和 while 循环在全局定义的函数中不起作用
- c++ 中的 range-for 会调用项的复制构造函数吗?
- 计算使用 C++ std 函数而不是 for 循环的大 O
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- lambda deleter for Unique_ptr导致编译错误与函数
- 为什么我的 for 循环在我的 void 函数中不起作用
- 无法在 for 循环中的 pow 函数上输出答案
- C++ - 计算"for"函数中的平均值