【问题标题】:C++: Why decltype (*this) returns a reference?C++:为什么 decltype (*this) 返回一个引用?
【发布时间】:2014-10-08 08:25:55
【问题描述】:
template<typename T>
struct foo{
    void f(){
        decltype(*this) a(*this);
        do_some_test(a);
    }
    T data;
};
//compiler won't accept this

在我的解释中,decltype 应该返回 a 类型,以便我们可以在声明中使用它。但是google说在decltype(x)中,如果x是左值,它将返回T&amp;,其中T是x的类型。

但是他们设计它来返回参考是为了什么?此外,我应该怎么做才能在模板中创建与*this具有相同类型的类的实例?

【问题讨论】:

标签: c++ templates generic-programming


【解决方案1】:

decltype 推导出 表达式 的类型,除非它应用于变量,在这种情况下它会推导出该变量的类型:

decltype(e)表示的类型定义如下:

——如果 e 是一个无括号的 id 表达式或一个无括号的类成员访问,decltype(e) 是由e 命名的实体的类型。如果不存在这样的实体,或者如果e 命名了一组重载函数,则程序是非良构的;

——否则,如果e是一个xvalue,decltype(e)T&amp;&amp;,其中Te的类型;

——否则,如果e是一个左值,decltype(e)就是T&amp;,其中Te的类型;

——否则,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,不需要类型推导。

【讨论】:

  • 或者在c++14中可以直接使用std::remove_reference_t,不需要冗长的std::remove_reference::type跨度>
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 2013-02-14
  • 2011-08-03
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多