GCC 11.1 отвергает концепцию range-v3 C++20, примененную к ref_view boost::iterator_range (которая принята более ранней C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 GCC 11.1 отвергает концепцию range-v3 C++20, примененную к ref_view boost::iterator_range (которая принята более ранней

Сообщение Anonymous »

Я сократил пример до следующего:

Код: Выделить всё

#include 
#include [*]
#include 

int main() {
std::list l;
using Foo = const ranges::ref_view&;
ranges::_size_::has_non_member_size;
}
который
  • с -std=c++20 компилируется с GCC = 1.1,
  • с -std=c++17 компилируется в обоих случаях.
Ошибка начинается так, и, похоже, она относится к концепции, которая требует сама себя (полную информацию об ошибке см. в первой ссылке выше):

Код: Выделить всё

In file included from /opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/view/ref.hpp:17,
from :3:
/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/range/traits.hpp: In substitution of 'template  requires (!(has_member_size) || (disable_sized_range)) && (!(has_non_member_size) || (disable_sized_range)) && (forward_iterator) && (sized_sentinel_for) constexpr ranges::_size_::fn::_result_t ranges::_size_::fn::operator()(R&&) const [with R = const ranges::ref_view&]':
/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/range/traits.hpp:76:47:   required by substitution of 'template using range_size_t = decltype (ranges::_::size(declval())) [with Rng = const ranges::ref_view]'
/opt/compiler-explorer/libs/rangesv3/trunk/include/meta/meta_fwd.hpp:286:18:   required by substitution of 'template  requires  valid struct meta::detail::defer_ [with C = ranges::range_size_t; Ts = {const ranges::ref_view}]'
/opt/compiler-explorer/libs/rangesv3/trunk/include/meta/meta.hpp:788:12:   required from 'struct meta::defer'
/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/view/ref.hpp:121:1:   required from 'struct boost::range_size'
/opt/compiler-explorer/libs/boost_1_85_0/boost/range/size.hpp:55:5:   required by substitution of 'template typename boost::range_size::type boost::size(const SinglePassRange&) [with SinglePassRange = ranges::ref_view]'
/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/range/primitives.hpp:63:9:   required from here
/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/range/primitives.hpp:63:9:   required for the satisfaction of 'has_non_member_size_requires_' [with T = const ranges::ref_view&]
/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/range/primitives.hpp:63:9:   in requirements with 'T&& t' [with T = const ranges::ref_view&]
/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/range/primitives.hpp:63:9: error: satisfaction of atomic constraint 'requires(T&& t) {ranges::_size_::size((T&&(t)));} [with T = T]' depends on itself
63 |         CPP_requires(has_non_member_size_,
|         ^
Некоторые наблюдения:
  • удаление const из определения псевдонима Foo, исправления ошибка компиляции;
  • сохранение этой константы и изменение std::list на std::vector также устраняет ошибку компиляции;
    Я потерялся в черной магии макросов, происходящей между и ;

    Я думаю, что диапазоны::_size_::has_non_member_size; разрешаются в диапазоны::_size_::has_non_member_size_requires_; и clangd говорит мне, что если я это понимаю (а я так не думаю!), это эквивалентно

    Код: Выделить всё

    template 
    concept has_non_member_size_requires_ = requires(T &&t) { size((T &&)t); }
    
    но если я просто напишу такое понятие перед основным и подставлю его в последнюю строку исходного фрагмента, я не получу ошибку компиляции.

Может кто-нибудь просветить меня, что происходит?


Подробнее здесь: https://stackoverflow.com/questions/786 ... iterator-r
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»