Я пытаюсь понять, как работает std::declval<T>(). Я знаю, как его использовать и знаю, что он делает, в основном позволяет использовать decltype без создания объекта, например
decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo
Я знаю из cppreference.com, что std::declval<Foo> "добавляет" ссылку rvalue на Foo, которая из-за правил сбрасывания ссылок заканчивается тем, что является либо ссылкой на rvalue, либо ссылкой lvalue. Мой вопрос в том, почему конструктор Foo не называется? Как можно реализовать "игрушечную" версию std::declval<T> без создания параметра шаблона?
PS: Я знаю, это не то же самое, что старый трюк
(*(T*)(nullptr))