std :: declval <t>()如何工作?</t>

时间:2015-02-16 00:05:54

标签: c++ c++11

我想了解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))

1 个答案:

答案 0 :(得分:17)

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

E.g。

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

auto foo() -> Silly&&;

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

链接器不应该抱怨。