C ++:为什么decltype(* this)返回一个引用?

时间:2014-08-14 15:45:25

标签: c++ templates generic-programming

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具有相同类型的类的实例?

1 个答案:

答案 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,就不需要输入类型。