I know concept
HasInner = requires { typename T::inner; };
is ok. But I want know why the first one is not ok.
Because requires{ T::inner; }
expects T::inner
to not be a type (but rather a variable or a function). I'm not sure what answer you expected.
It wouldn't be very useful to make T::inner
accept both types and non-types.