Разрешение перегрузки функции в предложении requireC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Разрешение перегрузки функции в предложении require

Сообщение Anonymous »


Похоже, существует несоответствие между Clang и GCC при попытке удовлетворить концепцию c для типа s. Прибегая к ADL для поиска жизнеспособной перегрузки функции f, Clang, похоже, считает, что независимость перегрузки f(c auto) является трудной задачей. ошибка. Принимая во внимание, что GCC, похоже, считает это неудачей замены, просто отбрасывая кандидата вместо отклонения кода.

void f(int); шаблон концепция c = требует (T t) { f (t); }; структура с {}; недействителен f(s); недействительный f (c авто); static_assert(c); // лязг нет, gcc ок, msvc нет Должен ли этот код быть отклонен и привести к серьезной ошибке? Что говорит стандарт C++20 об этом сценарии?

Демо

Сообщение об ошибке Clang:

:4:13: ошибка: удовлетворение ограничения 'requires (T t) { f(t); }' зависит от самого себя 4 | концепция c = требует (T t) { f (t); }; | ^~~~~~~~~~~~~~~~~~~~~~~ :4:13: примечание: при подстановке аргументов шаблона в ограничение выражение здесь 4 | концепция c = требует (T t) { f (t); }; | ^~~~~~~~~~~~~~~~~~~~~~~ :8:8: примечание: при проверке соответствия концепции 'c' просил здесь 8 | недействительный f (c авто); | ^ :8:8: примечание: при подстановке аргументов шаблона в ограничение выражение здесь 8 | недействительный f (c авто); | ^ :4:29: примечание: при проверке удовлетворения ограничений для шаблона 'f' требуется здесь 4 | концепция c = требует (T t) { f (t); }; | ^ :4:29: примечание: при создании экземпляра специализации шаблона функции 'f' просил здесь :4:29: примечание: при реализации требования здесь 4 | концепция c = требует (T t) { f (t); }; | ^~~~ :4:13: примечание: при подстановке аргументов шаблона в ограничение выражение здесь 4 | концепция c = требует (T t) { f (t); }; | ^~~~~~~~~~~~~~~~~~~~~~~ :10:15: примечание: при проверке соответствия концепции 'c' просил здесь 10 | static_assert(c); | ^~~~ :10:15: ошибка: не удалось выполнить статическое утверждение 10 | static_assert(c); | ^~~~ :10:15: примечание: поскольку замененное выражение ограничения имеет неверный формат: ограничение зависит от ранее диагностированного выражения Сообщение об ошибке MSVC:
(8): ошибка C7608: атомарное ограничение должно быть постоянным выражением. (10): примечание: см. ссылку на компилируемый шаблон переменной 'bool c'. (8): ошибка C2131: выражение не получило константу (8): примечание: сбой был вызван чтением неинициализированного символа. (8): примечание: см. использование 'c'
Ответить

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

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

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

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

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