Подтвердить что ты не робот

Как работает std:: declval <T>()?

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

Ответ 1

В принципе, в выражении sizeof или decltype вы можете вызывать функции, которые нигде не выполняются (их нужно объявить, не реализовывать).

например.

class Silly { private: Silly( Silly const& ) = delete; };

auto foo() -> Silly&&;

auto main() -> int
{
    sizeof( foo() );
}

Линкер не должен жаловаться на это.