我想了解std::declval<T>()
的工作原理。我知道如何使用它,并知道它的作用,主要是允许你在不构造对象的情况下使用decltype
,比如
decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo
我从cppreference.com知道std::declval<Foo>
&#34;添加&#34;对Foo
的右值引用,由于参考折叠规则,它最终成为右值引用或左值引用。我的问题是为什么没有调用Foo
的构造函数?如何实现一个玩具&#34;版本std::declval<T>
而没有构建模板参数?
PS:I know它与旧技巧
不同(*(T*)(nullptr))
答案 0 :(得分:17)
基本上,在sizeof
或decltype
表达式中,您可以调用在任何地方都未实现的函数(它们需要声明,而不是实现)。
E.g。
class Silly { private: Silly( Silly const& ) = delete; };
auto foo() -> Silly&&;
auto main() -> int
{
sizeof( foo() );
}
链接器不应该抱怨。