gpt4 book ai didi

c++ - range_value_t 用于引用类型

转载 作者:行者123 更新时间:2023-12-04 12:21:34 32 4
gpt4 key购买 nike

我在玩 C++ 20 范围并注意到一些奇怪的东西(可在 https://gcc.godbolt.org/z/4Ycxn88qa 重现):

#include <vector>
#include <utility>
#include <string>
#include <ranges>
#include <type_traits>

int main()
{
using KV = std::pair<std::string, std::string>;

std::vector<KV> v;
auto r = v | std::views::filter([](const KV& kv) { return kv.first == "foo"; })
| std::views::transform([](const KV& kv) -> const std::string& { return kv.second; });

for (auto&& val : r) {
static_assert(std::is_same_v<decltype(val), const std::string&>);
}

using R = decltype(r);
using Elem = std::ranges::range_value_t<R>;

static_assert(std::is_same_v<Elem, std::string>); // success
static_assert(std::is_same_v<Elem, const std::string&>); // error
}
我期待最后 static_assert成功,倒数第二个失败,但反之亦然。为什么?
更新:显然 range_reference_t给我我需要的东西:
static_assert(std::is_same_v<std::ranges::range_reference_t<R>, const std::string&>); // ok
range_value_t应该总是给我一个腐烂的类型?

最佳答案

Is range_value_t supposed to always give me a decayed type?

value_type迭代器的(因此,范围)应该总是一个 cv-unqualified 类型,是的。这就是模型的工作方式。据我所知,这并没有在标准库中的任何地方真正指定,但是您可以看到 value_typeT*remove_cv_t<T> ( [iterators.iterator.traits]/5 ) 或者我们得到 value_type 的方式的 transform_view的迭代器是通过做 remove_cvref_treference类型( [range.transform.iterator] )。 reference ,另一方面,是您取消引用迭代器时获得的类型 - 字面意思是 decltype(*it) .不幸的是,这个名称令人困惑,因为 reference不一定是语言类型。
例如, int*基本上是最简单的迭代器:它的 value_typeint而它的 referenceint& .同样,对于 int const* , value_type是相同的(仍然是 int )而 reference更改(到 int const& )。

关于c++ - range_value_t 用于引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69066475/

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