gpt4 book ai didi

c++ - 通过转发的迭代循环的范围

转载 作者:行者123 更新时间:2023-11-30 01:15:02 25 4
gpt4 key购买 nike

假设我有以下情况

template<typename T>
void func(T&& arg)
{
for (auto elem : arg) // ***
{
// do stuff
}
}

其中 arg 是迭代器( vector 或初始化列表等)。我对 *** 行感兴趣:以下哪项更好:

auto elem
auto& elem
`const` of the above

我想选项 (3) 包含在参数推导中(如果需要的话,auto 会在那里放置一个常量)。 func 的调用也是如此

func(std::forward<T>(arg)); 

改变了什么?

最佳答案

使用 auto对于基于范围的变量声明 for loop 几乎总是是错误的。只有在保证范围使用未突变的内置对象的情况下,它才是正确的。我通常不会使用 auto在这里(公平地说,我也不会首先基于范围的 for,但更喜欢算法)。

使用 auto&约束 *it 的结果对于迭代器 it超出范围为 T&T const&对于一些合适的类型 T .例如,它不允许迭代 std::vector<bool> .如果允许元素发生变异,那是一个合理的选择。使用 auto const&约束 *it 的结果要么是一个左值,要么有一个复制构造函数,并且将防止范围被改变。根据用途,这可能是一个合理的选择。

一般来说,默认选择应该是auto&&因为这对 *it 的结果没有任何限制。除了不是 void .

所以,总结一下:

  • for (auto elem: arg)如果元素必须是内置的并且没有发生变化。
  • for (auto& elem: arg)如果元素是左值并且允许改变。
  • for (auto const& elem: arg)如果元素是左值但未发生变异。
  • for (auto&& elem: arg)在所有无关紧要的情况下。我想总是使用 auto&&没问题。

关于c++ - 通过转发的迭代循环的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29195679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com