Я замечаю нечетную семантику, ссылаясь на ссылки на указатели и массивы, которые различаются по консистенции элементов с указателем и массивом соответственно. С указателями это не удается предсказуемо:Binding const T (& ref) [N] к объекту типа T [N]
int* p{};
const int*& p_ref{p};
non-const lvalue reference to type 'const int *' cannot bind to a value of unrelated type 'int *'
Имеет смысл, указатель на межд и указатель на сопзЬ-междунар два различных типа, добавляя const
перед &
позволяет компилятору для создания временного, который работает, но не меняет вышеизложенного.
Однако то, что я думал, что должно быть аналогично с массивами не
int arr[5]{};
const int (&arr_ref)[5]{arr};
лязг и НКУ как компилировать выше без жалоб, но почему? Я связываю неконстантную ссылку на const int[5]
на объект типа int[5]
. Почему это разрешено?
Update: Аналогичная проблема описывается Gotcha # 32 (стр 82) в C++ Gotchas Стивене С. Dewhurst
Также рассмотрим 'int * const & p_ref {p};'. – Hurkyl
@Hurkyl Это просто нормальное связывание const ref с переменной non const? –
Континентальное размещение констант здесь имеет значение: https://kuhllib.com/2012/01/17/continental-const-placement/ – Arvid