【问题标题】:ranges v3 any_view & constant范围 v3 any_view & 常量
【发布时间】:2021-03-07 16:00:18
【问题描述】:

以下简单代码失败:

#include <vector>
#include <range/v3/all.hpp>

int main()
{
    std::vector<int> const v{ 1, 2, 3, 4 };
    ranges::any_view<int, ranges::category::bidirectional |
                              ranges::category::sized> const a{v};
    ranges::begin(a);
}

但如果在这里删除常量:

 a { v };

一切正常。它是一个错误吗?还是我看不懂any_view的语义。

UPD:这是 MSVC 16.9.0 Preview 1.0 编译器。

【问题讨论】:

    标签: c++ visual-c++ range-v3


    【解决方案1】:

    ranges::begin(a) 调用

    template<typename R>
    ranges::_begin_::fn::operator ()(R && r)
    

    需要可修改或右值参数r

    a 声明为 const a{v} 将调用 ranges::_begin_::fn::operator ()&lt;const ranges::any_view&lt;...&gt;&gt;(const ranges::any_view&lt;...&gt; &amp;&amp; r),这是不可能的,因为它将右值 a 绑定到左值参数。

    【讨论】:

    • 我猜 && 是通用引用,而不是右值引用。但我更感兴趣为什么下面的代码正在工作 auto const b = v |范围::views::transform([](auto i){ return i + 1; });范围::开始(b);恒定且不带它。看起来不一致。
    • 对,普遍崇敬既可以推论为泛指参考,也可以推论为右值参考。如果存在ranges::_begin_::fn::operator ()(const R &amp; r) 的重载,则在为const a 推导const R &amp; rconst R &amp;&amp; r 之间的模板参数时会产生歧义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多