Я пытаюсь понять, как работает 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))