Как я могу использовать лямбда-выражение в качестве постоянного основного выражения в предложении require?

Я пытаюсь понять различные способы указания предложения С++. Мне нужно более глубокое понимание, а не техническое решение для определения ограничения.

Подумайте о функции шаблона:

template<typename T>
T func(T t) {
  return t;
}

Можно добавить простое, но бесполезное предложение require:

template<typename T>
requires true
T func(T t) {
  return t;
}

и я мог бы вызвать эту функцию так:

foo(1);

Насколько я понимаю https://en.cppreference.com/w/cpp/language/constraints#Requires_clauses Я также мог бы использовать постоянное лямбда-выражение, поскольку лямбда-выражение также является основным выражением ( https:/ /en.cppreference.com/w/cpp/language/expressions#Primary_expressions).

template<typename T>
requires [] { return  true; }
T func(T t) {
  return t;
}

Используя cl.exe из VS2019/VS2022, я получаю ошибку компиляции, похожую на (переведено):

ошибка C7607: атомарное ограничение должно быть постоянным выражением типа Bool...

Я пробовал использовать constexpr, но безуспешно.

Чего я не хочу: requires ([] { return true; }())

Ух. Это не единственное требование, поскольку это первичное выражение, оно должно быть логической константой времени компиляции.

HolyBlackCat 30.07.2024 12:07

@HolyBlackCat: Я понимаю это и думал, что смогу сделать лямбда-выражение constexpr, но мне это не удалось. Вот почему я задал этот вопрос - я действительно застрял.

ur. 30.07.2024 12:10

Лямбда-выражение не является bool, пока вы его не вызовете. Кажется, вы это знаете (последний абзац вашего вопроса), поэтому я не понимаю, почему вы думали, что вам сойдет с рук не вызвать.

HolyBlackCat 30.07.2024 12:17

вы даете ссылку, но непонятно, что именно здесь en.cppreference.com/w/cpp/language/constraints#Requires_clau‌​ses заставило вас сделать вывод, что ваш фрагмент подойдет

463035818_is_not_an_ai 30.07.2024 15:37
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Тип лямбда-выражения — это тип класса, определенный компилятором. Не имеет значения, что возвращает лямбда, если вы на самом деле не вызываете лямбду.

Типы классов не являются логическими типами. Поскольку стандарт требует, чтобы выражение в предложении requires было постоянным выражением логического типа. Вы можете сделать лямбда-выражение постоянным выражением, но не можете сделать его логическим.

Я неверно истолковал описание на XXX, и ваш ответ мне помог, особенно потому, что вы ссылались на стандарт C++. Большое спасибо! Также спасибо всем остальным комментаторам, я понял, что не могу сформулировать свой вопрос по существу и что это, должно быть, сбивает с толку. Простите за это.

ur. 31.07.2024 10:50

Как я могу использовать лямбда-выражение в качестве постоянного основного выражения в предложении require?

Немедленным вызовом лямбды.

Это связано с тем, что [] { return true; } является объектом некоторого типа, специфичного для компилятора (так называемого типа замыкания), но выражение require должно быть постоянным выражением типа bool.

Итак, чтобы это заработало, просто вызовите лямбду, используя оператор вызова функции () с дополнительными круглыми скобками вокруг него. Демо

Кажется, они уже знают (отчасти?) это, как показано в последнем абзаце вопроса.

HolyBlackCat 30.07.2024 16:21

@HolyBlackCat Другой ответ также указывает на то же самое. ОП, похоже, не знает, что лямбда не конвертируется в bool. Они? Какой последний абзац вы имеете в виду? Я пытался найти этот абзац, но не вижу нигде, где бы упоминалось что-нибудь о преобразовании bool и т. д. Они знают только, что ограничение должно быть типа bool.

user12002570 30.07.2024 16:22

Я имел в виду «Чего я не хочу: requires ([] { return true; }())». Я не критикую ваш ответ, просто не понимаю, чего хочет ОП. Поскольку они return true; даже в примерах, где лямбда не вызывается, они, похоже, хотят, чтобы лямбда вызывалась автоматически, но ¯\_(ツ)_/¯

HolyBlackCat 30.07.2024 16:29

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

C# LinQ: фильтровать объект[] с элементами, содержащими строку (или ее часть) из строки[]
Неточные вычисления последовательности Фибоначчи во время компиляции в рекурсивной лямбда-выражении
Ясность синтаксиса Java Lambda
В GCC внутри лямбды я могу получить переменную constexpr из лямбды шаблона, отличного от constexpr, но не в Visual C++
Получить переменную constexpr из лямбда-функции можно, но компиляция завершается неудачей (Visual C++) и штрафом (gcc), когда такой оператор находится в новой лямбда-функции
Каков тип шаблонной лямбды?
Тернарный оператор не работает внутри функции Lambda Ruby
Создание универсального селектора/установщика свойств на C#, если вы знаете тип только во время выполнения
Как преобразовать лямбда-функцию в другую, используя кортеж параметров
Если лямбда объявлена ​​внутри аргумента по умолчанию, отличается ли она для каждого сайта вызова?