Код с использованием ограниченного авто, отклоненного GCC, но не ClangC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Код с использованием ограниченного авто, отклоненного GCC, но не Clang

Сообщение Anonymous »

Я не уверен, какой компилятор прямо здесь, так как я еще не полностью опытен с концепциями C ++ 20. Следующий код отклоняется GCC (15.1), говоря, что не существует соответствующей объявления для foo :: do_foo , clang (20.1.0) принимает код. Вот на Годболте. Замена Decktype (x) с помощью u в типе возврата или с использованием неограниченного U для параметра функции делает оба компилятора счастливо скомпилировать код. Идея заключалась в том, чтобы тип возврата был диапазоном констального T всякий раз, когда пройденное параметр является const .
Какой компилятор «в праве» здесь? Или, альтернативно, является ли следующее правильное C ++? < /P>
Спасибо! < /P>
#include
#include
#include
#include

template
concept RangeReturnTypeIsConvertibleTo = requires(RangeType r) {
{ *r.begin() } -> std::convertible_to;
};

template
concept RangeOf = std::ranges::range &&
RangeReturnTypeIsConvertibleTo;

template
concept IsQualificationOf = std::same_as;

class Foo {
public:
using T = int;

template
auto do_foo(U&& x) -> RangeOf auto;
};

template
auto Foo::do_foo(U&& x) -> RangeOf auto
{
static std::vector bar{4, 5, 8};

return bar;
}

int main() {

auto foo = Foo();

for(auto a : foo.do_foo(4)) std::cout
:31:6: error: no declaration matches 'auto [requires ::RangeOf] Foo::do_foo(U&&)'
31 | auto Foo::do_foo(U&& x) -> RangeOf auto
| ^~~
:26:10: note: candidate is: 'template requires IsQualificationOf auto [requires ::RangeOf] Foo::do_foo(U&&)'
26 | auto do_foo(U&& x) -> RangeOf auto;
| ^~~~~~
:20:7: note: 'class Foo' defined here
20 | class Foo {
| ^~~
: In function 'int main()':
:42:28: error: use of 'auto [requires ::RangeOf] Foo::do_foo(U&&) [with U = int]' before deduction of 'auto'
42 | for(auto a : foo.do_foo(4)) std::cout

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

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

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

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

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

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

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