Очевидно, концепции C++ поверхностны.
Код: Выделить всё
#include
template
T add(T a, T b)
{ return a + b;}
template
concept addable = requires(T a, T b)
{
{ add(a, b) } -> std::same_as;
};
struct foo{};
static_assert(addable);
static_assert(addable); // Passes?!
int main()
{
add(foo{}, foo{}); // Will not compile
}
Можно ли каким-то образом выполнить оценку добавляемого экземпляра шаблона, чтобы foo больше не отображался добавляемым? Можно ввести ограничение на шаблон add, но я ищу более общий подход:
- Компилятор обнаруживает, что единственный match — это шаблон
- Компилятор пытается создать экземпляр шаблона.
Создание экземпляра завершается неудачно где-то в дереве расширения, и концепция оценивается как ложная.
Это отличается от того, что задают в C++20: проверка тел шаблона на соответствие концепциям, который хочет, чтобы потребитель концепции имел доступ только к тому, что эта концепция явно определяет. обеспечивает. Выполнение глубокой оценки добавляемого здесь на самом деле является не чем иным, как обычным созданием экземпляра шаблона. Таким образом, цель состоит в том, чтобы принудительно реализовать реализацию во время оценки концепции.
Подробнее здесь:
https://stackoverflow.com/questions/786 ... -c-concept