【问题标题】:Why can't compile std::views::take(std::uint64_t{})?为什么不能编译 std::views::take(std::uint64_t{})?
【发布时间】:2021-10-08 13:16:11
【问题描述】:
#include <cstdint>
#include <ranges>

int main()
{
    auto const il = {1, 2, 3, 4, 5, 6};
    auto const n1 = std::int32_t{3};
    auto const n2 = std::uint32_t{3};
    auto const n3 = std::int64_t{3};
    auto const n4 = std::uint64_t{3};

    il | std::views::take(n1); // ok
    il | std::views::take(n2); // ok
    il | std::views::take(n3); // ok
    il | std::views::take(n4); // error
}

online demo

为什么无法编译 std::views::take(std::uint64_t{})

【问题讨论】:

标签: c++ stl standards c++20 std-ranges


【解决方案1】:

P2367 之前,views::take(E, F) 的默认大小写被指定为表达式等效于ranges::take_view{E, F}。注意大括号。

ranges::take_view&lt;V&gt;range_difference_t&lt;V&gt;(已签名)作为其第二个参数。列表初始化拒绝缩小范围(例如,尝试使用 uint64_t 初始化 ptrdiff_t),因此您的示例被拒绝。

但是,现在 views::take(E, F) 被指定为表达式等效于 ranges::take_view(E, F)。带括号。这意味着不检查缩小范围,这意味着通过 uint64_t 完全没问题。

libstdc++ 在Apr 30 上实现了该更改,我想这对于 gcc 11.1 来说为时已晚,但该更改在 gcc 11.2 中存在,它接受您的代码。

【讨论】:

    【解决方案2】:

    range | std::views::take(n) 是等价于std::ranges::take_view(range, n) 的表达式,它接受a ranges::range_difference_t&lt;V&gt;

    遵循别名,gcc 11.1 不想在需要 long 的地方将 unsigned long 视为可用

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2021-08-20
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多