int v[1];
auto p1 = v;
auto &p2 = v;
auto *p3 = v;
p1
имеет тип int *
(то же самое для p3
). Особенно в этом тривиальном образце я нахожу p2
( int (&)[1]
) более полезным, поскольку он наследует семантику массива, например Я могу подать заявку sizeof
на p2
дать так же, как sizeof
на v
,
Есть ли стандартная цитата по этому поводу?
Почему по умолчанию ссылки — плохая идея? (в данном случае я имею в виду, что в наши дни программист на c ++ почти не заботится о них …)
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&&
,
Я считаю, что это для согласованности с не шаблонными функциями. Массивы подвергаются преобразованию массива в указатель каждый раз, когда к ним обращаются, за исключением случаев, когда они привязаны к ссылке. Таким образом, с существующими правилами согласуются следующие:
int v[1];
void foo(int *);
int main()
{
foo(v);
}
а также
int v[1];
template <class T>
void foo(T);
int main()
{
foo(v);
}