【发布时间】:2015-02-16 00:05:53
【问题描述】:
我想了解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> 的“玩具”版本?
PS:I know和老招不一样
(*(T*)(nullptr))
【问题讨论】:
-
来自同一页面:“请注意,由于不存在 declval 的定义,因此只能在未计算的上下文中使用它;计算包含此函数的表达式是错误的。”
-
@remyabel 是的,我看到了,我只是不知道如何“构建”我自己的
declval -
template< class T > typename std::add_rvalue_reference<T>::type declval();实际上就是您所需要的。 Live example -
@vsoftco:您正在调用对象的非静态成员函数。 (嗯,如果表达式被评估,你会是)并且为了调用非静态成员函数,你使用一个点。为什么你会期望在这种情况下会有所不同?具体来说,您为什么希望使用范围运算符?