3

我有一个字符串,其中包含以,字符分隔的数字序列。要将序列中的值读入数组,我创建了 GCC 10 拒绝编译的以下代码:

#include <ranges>
#include <string_view>
#include <charconv>
#include <array>

template<std::size_t Sz>
bool to_bytes(std::array<std::uint8_t, Sz> &data, std::string_view string) {
    auto target = data.rbegin();
    for (const auto octet : string | std::views::split('.')) {
        if (target == data.rend()) {
            return false;
        }

        const auto octet_begin = octet.data();
        const auto octet_end = octet_begin + octet.size();
        const auto error = std::error_code(std::from_chars(octet_begin, octet_end, *target).ec);
        if (error) {
            return false;
        }

        ++target;
    }

    return target == data.rend();
}

简而言之,编译器抱怨没有可用于变量类型data()的方法。我是否误解了那种应该符合标准的类型?从我的观点来看,这似乎是有争议的。size()octetoctetcontiguous_rangestring_view

4

1 回答 1

3

在采用P2210作为针对 C++20 的缺陷报告后,views::split现在可以保持连续性,因此上述代码现在有效并在 gcc trunk 上编译


我是否误解了那种octet应该符合contiguous_range标准的类型string_view

是的。octet不是一个。_ contiguous_rangea 的内部范围split_view永远不会比 a 强forward_range- 它只是 aforward_range或 an input_range

这使得views::split用于任何类型的非平凡解析都非常尴尬 - 正是因为,正如您在问题中所证明的那样,除非您随后手动生成一个连续的范围,否则您不能使用from_chars(or or ... ) 之类的东西scanf.

于 2020-05-30T19:03:50.897 回答