auto和delctype(auto)类型推导示例

时间:2018-12-01 12:16:43

标签: c++ auto decltype

我读了一篇有关auto的类型为decltype的类型推导的文章,我想知道我的逻辑关于下面的示例中如何推导类型是正确的(因此,如果我弄错了,请纠正我:)

#include <iostream>
using namespace std;

class Widget
{
public:
    Widget() = default;
};

int main()
{
    Widget w;
    const Widget& cw = w;          // cw is const Widget&
    auto myWidget1 = cw;           // (1) myWidget1  is Widget
    decltype(auto) myWidget2 = cw; // (2) myWidget2 is const Widget&
}

到目前为止,我了解的是:

为1 :使用自动类型推导,在这种情况下,就像按值传递的parm的temlpate类型推导。这意味着cv-qualifiers和refs被忽略,最终将导致Widget作为类型。

表示2 :先使用decltype,然后将其自动传递给cw一个const Widget&,然后全部设置,类型为const Widget&。

所以我写/理解的是对还是错?

谢谢

1 个答案:

答案 0 :(得分:7)

这是一个技巧,因此您可以使编译器打印类型:

template <typename>
struct TD;

然后使用:

TD<decltype(myWidget1)>();

由于TD<...>是不完整的类型,编译器会抱怨,并在错误消息中打印您的类型:

  

错误:无效使用不完整类型struct TD<Widget>

所以myWidget1的类型是Widget

myWidget2的类型:

  

错误:无效使用不完整类型struct TD<const Widget&>

因此,您怀疑它的类型确实是const Widget &

是的,您所描述的是正确的。