Ответ 1
decltype(a)
- int
. Это соответствует вызову f
с int
prvalue - что-то вроде f(7)
. Это действительно не компилируется, потому что ссылка non- const
lvalue не может привязываться к значению prvalue.
То, что вы делаете в main
- это вызов f
с lvalue, a
, к которому ссылка может привязываться просто отлично.
Чтобы получить правильный результат из std::is_invocable
, используйте форму выражения decltype
, добавив круглые скобки:
std::is_invocable_v<decltype(foo), decltype((a))>
// ^ ^