C++ C+错误+;20个范围和标准::视图::获取

C++ C+错误+;20个范围和标准::视图::获取,c++,gcc,range,clang,c++20,C++,Gcc,Range,Clang,C++20,我在试验C++20范围,在使用GCC11.1.0和CMAKE3.20.3编译时,我得到了以下奇怪的行为。具体而言,以下代码不会编译: auto Foo() { std::vector<long int> x{1, 2, 3, 4, 5, 6}; return std::views::all(x) | std::views::take(x.size()); // return std::views::all(x) | std::views::take(stati

我在试验C++20范围,在使用GCC11.1.0和CMAKE3.20.3编译时,我得到了以下奇怪的行为。具体而言,以下代码不会编译:

auto Foo() {
    std::vector<long int> x{1, 2, 3, 4, 5, 6};
    return std::views::all(x) | std::views::take(x.size());
    // return std::views::all(x) | std::views::take(static_cast<int>(x.size()));
}

Clang 12.0.1不应该支持包括范围在内的C++20功能吗?为什么会出现此错误?

这是一个将由修复的库错误,因为它被指定为执行
take\u view{E,F}
(这将是一个缩小的转换),而不仅仅是
take\u view(E,F)
(这很好)。在此期间,你必须做相应的演员


还包括:

std::views::all(x)| std::views::take(x.size());
这只是一个漫长的写作过程:

x | std::views::take(x.size());
您应该很少(如果有)需要在用户代码中编写
views::all
。图书馆为你做这件事


Clang12.0.1不应该支持包括范围在内的C++20特性吗?为什么会出现这个错误


这与范围无关,clang只是不完全支持libstdc++在其实现中使用的C++20语言功能(在本例中)。

这是一个库错误,将由修复,因为它被指定执行
take_view{E,F}
(这将是一个缩小的转换),而不是
take_view(E,F)
(这很好)。在此期间,你必须做相应的演员


还包括:

std::views::all(x)| std::views::take(x.size());
这只是一个漫长的写作过程:

x | std::views::take(x.size());
您应该很少(如果有)需要在用户代码中编写
views::all
。图书馆为你做这件事


Clang12.0.1不应该支持包括范围在内的C++20特性吗?为什么会出现这个错误


这与范围无关,clang只是不完全支持libstdc++在其实现中使用的C++20语言功能(在本例中)。

非常感谢您的回答!另外,我使用
std::views::all
只是为了测试,但我知道这是不必要的!请允许我问一下,是否有一种变通方法可以在C++20范围内使用Clang,比如一些补丁或第三方更新?@fdev Nope。您可以改用range-v3。非常感谢您的回答!另外,我使用
std::views::all
只是为了测试,但我知道这是不必要的!请允许我问一下,是否有一种变通方法可以在C++20范围内使用Clang,比如一些补丁或第三方更新?@fdev Nope。您可以改用range-v3。
[...] error: no match for ‘operator|’ (operand types are ‘std::ranges::ref_view<std::vector<long int> >’ and ‘std::ranges::views::__adaptor::_Partial<std::ranges::views::_Take, long unsigned int>’)
[build]   230 |     return std::views::all(x) | std::views::take(x.size());
[build]       |            ~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
[build]       |                           |                     |
[build]       |                           |                     std::ranges::views::__adaptor::_Partial<std::ranges::views::_Take, long unsigned int>
[build]       |                           std::ranges::ref_view<std::vector<long int> >
[build] /usr/include/c++/11/ranges:739:13:   required for the satisfaction of ‘__adaptor_invocable<_Self, _Range>’ [with _Self = std::ranges::views::__adaptor::_Partial<std::ranges::views::_Take, long unsigned int>; _Range = std::ranges::ref_view<std::vector<long int, std::allocator<long int> > >]
[build] /usr/include/c++/11/ranges:740:9:   in requirements  [with _Args = {std::ranges::ref_view<std::vector<long int, std::allocator<long int> > >}; _Adaptor = std::ranges::views::__adaptor::_Partial<std::ranges::views::_Take, long unsigned int>]
[build] /usr/include/c++/11/ranges:740:44: note: the required expression ‘declval<_Adaptor>()((declval<_Args>)()...)’ is invalid, because
[build]   740 |       = requires { std::declval<_Adaptor>()(declval<_Args>()...); };
[build]       |                    ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
[build] /usr/include/c++/11/ranges:740:44: error: use of deleted function ‘constexpr auto std::ranges::views::__adaptor::_Partial<_Adaptor, _Arg>::operator()(_Range&&) const && [with _Range = std::ranges::ref_view<std::vector<long int> >; _Adaptor = std::ranges::views::_Take; _Arg = long unsigned int]’
[build] /usr/include/c++/11/ranges:862:9: note: declared here
[build]   862 |         operator()(_Range&& __r) const && = delete;
[build]       |         ^~~~~~~~
[build] In file included from /usr/include/c++/11/streambuf:41,
[build]                  from /usr/include/c++/11/bits/streambuf_iterator.h:35,
[build]                  from /usr/include/c++/11/iterator:66,
[build]                  from /usr/include/c++/11/ranges:43,
[build]                  from ../mmpc/test/parametric_controller.test.cpp:27:
[build] /usr/include/c++/11/bits/ios_base.h:87:3: note: candidate: ‘constexpr std::_Ios_Fmtflags std::operator|(std::_Ios_Fmtflags, std::_Ios_Fmtflags)’
[build]    87 |   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
[build]       |   ^~~~~~~~
[build] /usr/include/c++/11/bits/ios_base.h:87:27: note:   no known conversion for argument 1 from ‘std::ranges::ref_view<std::vector<long int> >’ to ‘std::_Ios_Fmtflags’
[build]    87 |   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
[build]       |             ~~~~~~~~~~~~~~^~~
[build] /usr/include/c++/11/bits/ios_base.h:129:3: note: candidate: ‘constexpr std::_Ios_Openmode std::operator|(std::_Ios_Openmode, std::_Ios_Openmode)’
[build]   129 |   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
[build]       |   ^~~~~~~~
[build] /usr/include/c++/11/bits/ios_base.h:129:27: note:   no known conversion for argument 1 from ‘std::ranges::ref_view<std::vector<long int> >’ to ‘std::_Ios_Openmode’
[build]   129 |   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
[build]       |             ~~~~~~~~~~~~~~^~~
[build] /usr/include/c++/11/bits/ios_base.h:169:3: note: candidate: ‘constexpr std::_Ios_Iostate std::operator|(std::_Ios_Iostate, std::_Ios_Iostate)’
[build]   169 |   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
[build]       |   ^~~~~~~~
[build] /usr/include/c++/11/bits/ios_base.h:169:26: note:   no known conversion for argument 1 from ‘std::ranges::ref_view<std::vector<long int> >’ to ‘std::_Ios_Iostate’
[build]   169 |   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
[build]       |             ~~~~~~~~~~~~~^~~
[build] /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/ranges:3392:19: error: missing 'typename' prior to dependent type name 'iterator_traits<iterator_t<_Base>>::iterator_category'
[build]             using _Cat = iterator_traits<iterator_t<_Base>>::iterator_category;
[build]                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~