Почему C 20 не разрешает псевдоним типа в обязательном выражении?

#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 , что это, очевидно, более выразительно, и никакой двусмысленности. @PatrickRoberts

4. Похоже, это работает как для версии «ошибка», так и для версии «хорошо» — не уверен, что этого вы хотели бы избежать.

5. @TedLyngmo: Может быть захвачен, хотя демо