gpt4 book ai didi

c++ - 函数采用对范围而不是 View 的转发引用是否有好处?

转载 作者:行者123 更新时间:2023-12-05 08:45:16 24 4
gpt4 key购买 nike

C++20 之前的版本,当 std::ranges::range 需要作为参数时,有必要在模板函数中使用转发引用。由于概念在 C++20 中可用,因此现在可以按值将 std::ranges::view 传递给泛型函数。根据标准, View 是一个范围。

考虑以下代码。

#include <vector>
#include <ranges>
#include <iterator>
#include <iostream>

template <std::ranges::range Range>
void fn1(Range range) // intentionally not a forwarding reference
{
for (auto& elem : range) {
++elem;
}
}

template <std::ranges::view View>
void fn2(View view)
{
for (auto& elem : view) {
++elem;
}
}

int main()
{
std::vector<int> v{1,2,3};
fn1(v); // doesn't increment, since a copy of 'v' is used in 'fn1'.
/* fn2(v); // fails to compile, since 'v' cannot be implicitly converted to a view */
fn1(std::views::all(v)); // increments, since a ref_view is passed to fn1
fn2(std::views::all(v)); // increments, as expected
for (int val : v)
std::cout << val << ' '; // 3 4 5
return 0;
}

我没有特别反对转发引用。人们可以声称能够直接将对范围建模的对象传递给通用函数(例如 fn1(v)),从而提高可读性。

这纯粹是偏好问题,还是在决定将通用函数参数实现为 Range&&View 时是否还有其他考虑因素?

最佳答案

从广义上讲,这是一个坏主意。

大多数范围不是 View 。 The ranges::view concept要求类型选择成为 View 。容器不是 View ;他们是容器。 span 是一个 View ,但 vector 不是。此外,大多数容器不能是 View ,因为 View 要求复制/移动是一个常量时间操作。对于大多数容器来说,这是不可能的。

因此,通过将模板专门限制为 view,基本上可以强制用户将传递给函数的任何内容包装在某种 View 类型中。这会在调用方产生大量无用的语法噪音。

关于c++ - 函数采用对范围而不是 View 的转发引用是否有好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73389666/

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