#c #standards #c 20 #c -concepts #type-alias
Вопрос:
#include <type_traits>
struct MyType { void operator [](int) const {} };
template<typename T>
concept IsMyType1 = requires(T obj)
{
{ obj[0] };
using U = std::remove_cvref_t<T>; // error
requires std::is_same_v<U, MyType>;
};
template<typename T>
concept IsMyType2 = requires(T obj)
{
{ obj[0] };
requires std::is_same_v<std::remove_cvref_t<T>,
MyType>; // okay
};
int main() {}
Почему C 20 не разрешает псевдоним типа в обязательном выражении?
Комментарии:
1. Как это можно было бы безопасно использовать?
2. Потому что псевдоним типа-это оператор, а не выражение
3. Но я думаю
IsMyType1
, что это, очевидно, более выразительно, и никакой двусмысленности. @PatrickRoberts4. Похоже, это работает как для версии «ошибка», так и для версии «хорошо» — не уверен, что этого вы хотели бы избежать.
5. @TedLyngmo: Может быть захвачен, хотя демо