std::d eclval<T>() 是如何工作的?

How does std::declval<T>() work?

本文关键字:何工作 工作 gt eclval lt std      更新时间:2023-10-16

我正在努力了解std::declval<T>()是如何工作的。我知道如何使用它,也知道它的作用,主要允许您在不构建对象的情况下使用decltype,比如

decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo

我从cppreference.com上知道,std::declval<Foo>Foo"添加"了一个右值引用,由于引用折叠规则,它最终要么是右值引用要么是左值引用。我的问题是为什么Foo的构造函数没有被调用?如何在不构建模板参数的情况下实现std::declval<T>的"玩具"版本?

附言:我知道这和老把戏不一样

(*(T*)(nullptr))

基本上,在sizeofdecltype表达式中,您可以调用未在任何地方实现的函数(它们需要声明,而不是实现)。

例如

class Silly { private: Silly( Silly const& ) = delete; };
auto foo() -> Silly&&;
auto main() -> int
{
    sizeof( foo() );
}

链接器不应该对此抱怨。