Почему при выводе типа для массивов указатель указывается первым, а не над массивом?

int v[1];
auto  p1 = v;
auto &p2 = v;
auto *p3 = v;

p1 имеет тип int * (то же самое для p3). Особенно в этом тривиальном образце я нахожу p2 ( int (&)[1] ) более полезным, поскольку он наследует семантику массива, например Я могу подать заявку sizeof на p2 дать так же, как sizeof на v,

Есть ли стандартная цитата по этому поводу?

Почему по умолчанию ссылки — плохая идея? (в данном случае я имею в виду, что в наши дни программист на c ++ почти не заботится о них …)

7

Решение

auto выводит не ссылочный тип.

auto& выводит ссылку.

auto const& выводит const ссылка.

auto&& выводит либо ссылку, const ссылка или ссылка на значение.

Это работает так же, как вывод типа при вызове template функция работает.

template<typename T>
void foo( T t );

T будут никогда быть выведен с помощью ссылочного типа — он всегда будет типом значения при выводе.

auto следует почти одинаковым правилам:

template<typename T>
void foo( T&& t );

является достаточно хорошо известной «универсальной ссылкой», аналогичной переменной типа auto&&,

4

Другие решения

Я считаю, что это для согласованности с не шаблонными функциями. Массивы подвергаются преобразованию массива в указатель каждый раз, когда к ним обращаются, за исключением случаев, когда они привязаны к ссылке. Таким образом, с существующими правилами согласуются следующие:

int v[1];

void foo(int *);

int main()
{
foo(v);
}

а также

int v[1];

template <class T>
void foo(T);

int main()
{
foo(v);
}
2

По вопросам рекламы [email protected]