declval提供了一种方式,即在不创建对象的情况下返回一个对象的引用,改引用通常用于获取对象成员的类型:
#include <utility>
#include <iostream>
using namespace std;
struct Default
{
int foo() const { return 1; }
};
struct NonDefault
{
NonDefault() = delete;
int foo() const { return 1; }
};
int main()
{
decltype(Default().foo()) n1 = 1; // type of n1 is int
decltype(declval<NonDefault>().foo()) n2 = n1; // type of n2 is int
cout << "type of n1 is " << typeid(n1).name() << endl;
cout << "type of n2 is " << typeid(n2).name() << endl;
return 0;
}
运行程序输出:
type of n1 is i
type of n2 is i
可以看到对于没有默认构造函数的NonDefault类型,可以通过declval生成对象的引用,然后通过改引用获取起成员foo的返回值类型。