пример вычета типа auto и delctype (auto) - PullRequest
0 голосов
/ 01 декабря 2018

Я прочитал статью о 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 : используется автоматическое удержание типа, и в этом случае оно похоже на удержание типа temlpate для передаваемых по значению параметров.Это означает, что cv-квалификаторы и ссылки игнорируются, что приводит к Widget как типу в конце.

для 2 : используется тип decl, а затем передается auto, что на самом делеcw const Widget &, а затем все установлены, и тип является const Widget &.

Так что я написал / понял правильно или неправильно?

Спасибо

1 Ответ

0 голосов
/ 01 декабря 2018

Вот хитрость, поэтому вы можете заставить компилятор печатать тип:

template <typename>
struct TD;

Затем используйте:

TD<decltype(myWidget1)>();

Поскольку TD<...> является неполным типом, компиляторбудет жаловаться и напечатает ваш тип в сообщении об ошибке:

ошибка: недопустимое использование неполного типа struct TD<Widget>

Итак, myWidget1 тип * Widget.

Тип myWidget2:

Ошибка: недопустимое использование неполного типа struct TD<const Widget&>

Таким образом, его тип действительно const Widget &, как вы и подозревали.

Так что да, то, что вы описали, верно.

...