Поведение концепций с параметром шаблона по умолчанию

Рассмотрим эту концепцию, которая имеет параметр шаблона по умолчанию.

template<class T, class = decltype([]{})>
concept IsDefined = sizeof(T) > 0;

Поскольку каждая лямбда имеет отдельный тип, можно было бы ожидать, что каждый экземпляр IsDefined<X> будет отличаться.

struct SomeType;

static_assert( false == IsDefined<SomeType> );

struct SomeType
{
   // Defined.
};

static_assert( true == IsDefined<SomeType> );

Clang и MSVC согласовывают и компилируют этот код. GCC не выполняет второе статическое утверждение, но только если оценивается первое статическое утверждение.

error: static assertion failed
   17 | static_assert( true == IsDefined<SomeType> );

Кто-нибудь из этих компиляторов ошибается? Или это поведение не указано?

Результаты компиляции смотрите здесь

Кажется, этот дубликат спрашивает о параметрах функции. И этот вопрос специфичен для понятий.

Drew Dormann 19.07.2024 18:18

Не было необходимости вновь поднимать этот вопрос. Обсуждение там вполне применимо и здесь.

user12002570 19.07.2024 18:29

@user12002570 user12002570, чтобы внести ясность: я спрашиваю, почему концепции ведут себя иначе, чем поведение и ответы, приведенные в вашей ссылке. Я считаю, что это справедливый вопрос. Кто-нибудь из этих компиляторов ошибается?

Drew Dormann 19.07.2024 18:34
class = decltype([]{}) не является функциональным аргументом по умолчанию. Почему вы ожидаете, что он будет отличаться при реализации концепции? Это может быть не указано в стандарте.
3CxEZiVlQ 19.07.2024 19:00

@3CxEZiVlQ Я согласен. Интересно, что три основных составителя согласны с тем, что такой параметр шаблона уникален в других контекстах. Возможно, ответом будет «не указано».

Drew Dormann 19.07.2024 19:10

Я просто наблюдаю нарушения ODR.

Yakk - Adam Nevraumont 19.07.2024 20:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
7
183
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Концепции не конкретизированы . Вместо этого выражение нормализуется в ограничение , а затем, когда оценивается идентификатор концепта, ограничение проверяется на соответствие.

В этом случае нормальной формой IsDefined является атомарное ограничение sizeof(T) > 0 с тождественным отображением T -> T; обратите внимание, что второй параметр не отображается в сопоставлении (см. [temp.constr.atomic]/1 ). Ваш код — IFNDR от [temp.constr.atomic]/3:

Если в разных точках программы результат удовлетворения различен для одинаковых атомарных ограничений и аргументов шаблона, программа некорректна и диагностика не требуется.

Значит, «template<typename T> struct dependent_zero : std::integral_constant<std::size_t, 0zu> {}; template<class T, class Unique = decltype([]{})> concept IsDefined = sizeof(T) >= dependent_zero<Unique>::value;» не будет IFNDR, потому что атомарные ограничения не идентичны?

Artyer 26.07.2024 10:11

Другие вопросы по теме