пример вывода типа auto и delctype(auto)

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

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

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

Спасибо


person Blood-HaZaRd    schedule 01.12.2018    source источник
comment
const auto& myWidget2 = cw; также даст вам const Widget&. Часто точный тип не имеет значения, но константность и то, является ли это ссылкой или значением, почти всегда имеют значение;)   -  person 463035818_is_not_a_number    schedule 01.12.2018


Ответы (1)


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

template <typename>
struct TD;

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

TD<decltype(myWidget1)>();

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

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

Итак, тип myWidget1Widget.

Тип myWidget2:

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

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

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

person geza    schedule 01.12.2018