Как работает 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))
Ответы
Ответ 1
В принципе, в выражении sizeof
или decltype
вы можете вызывать функции, которые нигде не выполняются (их нужно объявить, не реализовывать).
например.
class Silly { private: Silly( Silly const& ) = delete; };
auto foo() -> Silly&&;
auto main() -> int
{
sizeof( foo() );
}
Линкер не должен жаловаться на это.