Является ли тело требуемого блока неоценимым контекстом?

Является ли тело понятием понятия или требует блокировки необоснованного контекста? например. можно ли безопасно использовать std::declval?

template<typename T>
concept bool SomeConcept = requires(T a) {
    { a.someFunction(std::declval<int>()) } -> int;
};

Ответы

Ответ 1

Да. Из [temp.constr.expr], формулировка N4641:

Ограничение выражения - это ограничение, которое указывает требование на формирование выражения E путем замены аргументов шаблона. Ограничение выражения выполняется, если подстановка с E не сработала. В пределах ограничения выражения E является неоцененным операндом (пункт 5).

Поэтому использование declval должно быть в порядке.

В качестве альтернативы вы можете просто создавать объекты типов, которые вам нужны, поскольку в контексте требований мы на самом деле ничего не строим:

template<typename T>
concept bool SomeConcept = requires(T a, int i) {
    { a.someFunction(std::move(i)) } -> int;
};