template<typename T>
struct foo{
void f(){
decltype(*this) a(*this);
do_some_test(a);
}
T data;
};
//compiler won't accept this
在我的解释中,decltype
应该返回一个类型,以便我们可以在声明中使用它。但谷歌表示,在decltype(x)
中,如果x
是左值,它将返回T&
,其中T
是x的类型。
但他们设计的是什么来返回参考?此外,我该怎么做才能在模板中创建与*this
具有相同类型的类的实例?
答案 0 :(得分:13)
decltype
推导出表达式的类型,除非它应用于变量,在这种情况下它会推断出该变量的类型:
decltype(e)
表示的类型定义如下:- 如果e是未加密码的id-expression或未加括号的类成员访问,
decltype(e)
是由e
命名的实体的类型。如果没有这样的实体,或者e
命名了一组重载函数,那么该程序就是格式不正确的;- 否则,如果
e
是xvalue,则decltype(e)
为T&&
,T
的类型为e
;- 否则,如果
e
是左值,则decltype(e)
为T&
,T
的类型为e
;- 否则,
decltype(e)
是e
的类型。§7.1.6.2[dcl.type.simple]
取消引用指针会产生左值,因此decltype
将推导出对指针类型的左值引用:
一元
*
运算符执行间接:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是引用对象或函数的左值其中的表达点。§5.3.1[expr.unary.op]
因此,对于某些指针decltype(*p)
,p
推导出对指针类型的左值引用。
如果您希望从某个指针p
获取指针的类型,您可以使用:
std::remove_pointer<decltype(p)>::type
或者:
std::remove_reference<decltype(*p)>::type
或者,在您的示例中,您只需说foo
,就不需要输入类型。