gpt4 book ai didi

c++ - 为什么在 hana::中包装对按值返回的函数的调用总是规避 range::views::join 的要求?或者也许不是?

转载 作者:行者123 更新时间:2023-12-02 18:26:18 26 4
gpt4 key购买 nike

此函数可输入任何int ,返回 std::vector<int>按值(value):

auto make = [](int){
return std::vector<int>{1,2,3};
};

因此,这样的事情行不通

std::vector<int> v{1,2,3};
auto z = v | std::ranges::views::transform(make)
| std::ranges::views::join; // fails to compile

因为,我理解(如果我错了请纠正我),当迭代器包含在 join 中时进步,它通过 make 触发 vector 的生成。 ,但是当迭代器进入 join 时,那些临时的已经被销毁了。已解除引用。

但是,以下操作不会失败:

std::vector<int> v{1,2,3};
auto z = v | std::ranges::views::transform(boost::hana::always(make(int{})))
| std::ranges::views::join;

这是为什么呢?使用 always 引入了什么机制? ?

我认为以下是这两个功能的证明,makealways(make(int{})) ,返回一个临时的。我是不是搞错了?

static_assert(!std::is_reference_v<decltype(make(int{}))>);
static_assert(!std::is_reference_v<decltype(boost::hana::always(make(int{}))(int{}))>);

Full demo .

最佳答案

有两个单独的问题。

  • join_view 对纯右值范围连接范围的限制是 C++20 中的一个缺陷,已由 P2328R1 纠正。 。 转换(制作)| join 应该只在实现缺陷解决方案的标准库上工作(例如 libstdc++ trunk)。

  • hana::always 返回不同的内容,具体取决于它是作为左值还是右值调用。当作为左值调用时,它返回左值引用;当作为右值调用时,它返回纯右值。 transform 始终作为左值调用,而您的 static_assert 正在检查作为右值调用的结果。

关于c++ - 为什么在 hana::中包装对按值返回的函数的调用总是规避 range::views::join 的要求?或者也许不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70102205/

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