Константная ссылка на константу???
От: Denn  
Дата: 07.02.03 11:49
Оценка:
typedef int arr[10];

arr a;
const arr const &r = a;  // как это понимать? Ведь a не константа,
// меняя а получим изменение r, которой компилятор обязан гарантировать константность!!!

И второй вопрос: как объявить ссылку на массив не пользуясь typedef?
Re: Константная ссылка на константу???
От: Andrij Украина  
Дата: 07.02.03 12:26
Оценка:
Здравствуйте, Denn, Вы писали:

D>typedef int arr[10];

D>arr a;
D>const arr const &r = a;  // как это понимать? Ведь a не константа,
D>// меняя а получим изменение r, которой компилятор обязан гарантировать константность!!!


Компилятор ы будет гарантировать константность если ти попытаешся изменить r но a не константный масив. кстати референс есть константой по своей сути поетому const перед & необязателен
... << RSDN@Home 1.0 beta 5 >>
make it simple as possible, but not simpler
Re: Константная ссылка на константу???
От: comer США http://getboost.codeplex.com/
Дата: 07.02.03 12:34
Оценка:
Здравствуйте, Denn, Вы писали:

D>
D>const arr const &r = a;  // как это понимать? Ведь a не константа,
D>

Вообще то, это не правильно, и многие компиляторы выдают предупреждение, так как в данном случае дважды указываеться что r ссылка на константу.

Все варианты объявляеют ссыолку на константу типа arr:
D>
D>const arr const &r = a;
D>const arr &r = a;
D>arr const &r = a;
D>
getboost.codeplex.com
citylizard.codeplex.com
Re: Константная ссылка на константу???
От: Fiend  
Дата: 07.02.03 13:36
Оценка: 2 (1)
Ссылка на массив:
int arr[10];
int (&rarr)[10] = arr;
Re[2]: Но все таки...
От: Denn  
Дата: 07.02.03 14:27
Оценка:
Здравствуйте, Fiend, Вы писали:

F>Ссылка на массив:

F>int arr[10];
F>int (&rarr)[10] = arr;

Спасибо!!!
Однако, развитие темы: константная ссылка это тавтология. Ссылка всегда "привязана" только к одному своему объекту. О чем и предупреждает таки, вопреки всему, MSVC++ 6.0 в отмеченных строках. Которые соответствуют стандарту более чем проскакивающие варианты!

    int arr[10]; 
    const int const (&rarr)[10] = arr;
    const int (& const crarr)[10] = arr;   //Warning

    typedef int marr[12];
    marr a;
    const marr const &rr = a;
    const marr& const r = a;               //Warning


Вопрос такой: а то что проскакивает, это вообще синтаксически верные конструкции и эквивалентны ли они "правильным" описаниям, а если эквивалентны, то зачем два способа описания?
Re[3]: Но все таки...
От: Аноним  
Дата: 07.02.03 14:32
Оценка:
Знаешь, все примеры — которые "проскакивают", и на которых ворнинги — неправильные.
Re[3]: Но все таки...
От: comer США http://getboost.codeplex.com/
Дата: 07.02.03 18:17
Оценка:
Здравствуйте, Denn, Вы писали:

Еще раз, вот это:
D>
D>...
D>    const int const (&rarr)[10] = arr;
D>...
D>    const marr const &rr = a;
D>...
D>

масло маслянное. Так же как и:
const int const a;
getboost.codeplex.com
citylizard.codeplex.com
Re: Константная ссылка на константу???
От: Андрей Тарасевич Беларусь  
Дата: 08.02.03 03:28
Оценка: 4 (1)
Здравствуйте, Denn, Вы писали:

D>
D>typedef int arr[10];

D>arr a;
D>const arr const &r = a;  // как это понимать? Ведь a не константа,
D>// меняя а получим изменение r, которой компилятор обязан гарантировать константность!!!
D>


'r' — это не сам объект, а путь доступа к объекту. Твоя константность — это константность именно пути доступа. Она означает, что именно через этот путь доступа объект поменять нельзя (точнее, можно, но это требует специальных усилий). Компилятор не гарантирует и никогда не гарантировал, что объект не может поменяться через какие-то другие пути доступа. Да даже и с этого пути доступа константность можно снять при помощи 'const_cast' и выполнить изменение объекта (при условии, что сам объект неконстантен, как в твоем примере).

D>И второй вопрос: как объявить ссылку на массив не пользуясь typedef?


int a[10];
int (&ra)[10] = a;
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.