Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149

Ссылка на указатель на константу

09.11.2018, 02:49. Показов 1516. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите почему неверна конструкция
C++
1
2
3
4
int *k=new int(10);
int const* &t=k;         //неверно
int const* &&t=k;        //а так верно
int const*const &t=k;    //и так верно
k это что rvalue?? ведь это же указатель, а указатель это переменная со значением адреса
Почему так?
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2018, 02:49
Ответы с готовыми решениями:

Ссылка на указатель на константу
Добрый вечер! Не подскажите почему только выражение с pi_ref3 верное, а остальные - нет (VS 2013). Выражение с pi_ref1 вроде как-то...

Константный указатель или указатель на константу?
Привет всем.Уважаемые программисты пожалуйста скажите чем отличать когда написано например int const* a='3' -то const касается на указатель...

Преобразование в указатель на указатель на константу
В упор не могу понять правила которые приводит Дьюхерст для преобразований "многоуровневых" указателей. (Дьюхерст "Скользкие...

8
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,198
09.11.2018, 06:59
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Цитата Сообщение от Fatinho Посмотреть сообщение
Подскажите почему неверна конструкция
Потому же, почему не верна инициализация

C++
1
2
int **pp = 0;
const int **cp = p;
но при этом разрешается

C++
1
2
int **pp = 0;
const int *const *ccp = p;
См. здесь: Распространенные ошибки

Только в вашем случае вместо одного из указателей выступает ссылка. Это принципиально не меняет дела. Преобразование T *& к const T *& страдает от такого же нарушения константной корректности, что и преобразование T ** к const T **.

---

В вашем примере, если бы можно было делать

C++
1
2
int *k=new int(10);
int const* &t=k;
то далее я бы мог продолжить

C++
1
2
const int c = 42;
t = &c;
и вуаля: теперь у меня указатель k типа int * указывает на объект c типа const int. А это грубое нарушение константной корректности, для которого мне не пришлось применять никаких явных кастов (!).

Вот для того, чтобы такие трюки не проходили, ваше int const* &t=k; и не допускается.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
09.11.2018, 15:39
Const - обещание (гарантия) или требование?
1
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149
09.11.2018, 16:43  [ТС]
А как тогда объяснить
C++
1
2
nt *k=new int(10); 
int const* &&t=k;
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
09.11.2018, 17:41
Fatinho, у Вас ссылка на int const * и Вы пытаетесь её инициализировать значением типа int *.
Соответственно будет создан временный объект типа int const *.
Временный объект не может быть привязан к неконстантной lvalue-ссылке,
но может быть привязан к константной lvalue-ссылке или к rvalue-ссылке, поэтому
C++
1
2
3
int const * &t=k;         //неверно, попытка инициализации lvalue-ссылки временным объектом,
int const * &&t=k;        //а так верно, временный объект привязывается к rvalue-ссылке,
int const * const &t = k; //и так верно, временный объект привязывается к константной lvalue-ссылке.
Причем заметьте, что t ссылается не на k, а на созданный временный объект,
можете проверить, t = nullptr никак не отразится на k.

Если уйти от указателей, то ситуация аналогична этой:
C++
1
2
3
4
int k = 10;
double & t = k;        //неверно, попытка инициализации lvalue-ссылки временным объектом,
double && t = k;       //а так верно, временный объект привязывается к rvalue-ссылке,
double const & t = k;  //и так верно, временный объект привязывается к константной lvalue-ссылке
2
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149
10.11.2018, 15:25  [ТС]
Почему тогда тут не создается временный объект
C++
1
2
int const a=45;
int &&b=a;
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
10.11.2018, 23:08
Fatinho, а почему должен?
Это не тоже самое, что код из первого поста.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,198
10.11.2018, 23:35
Цитата Сообщение от Fatinho Посмотреть сообщение
Почему тогда тут не создается временный объект
C++
1
2
int const a=45;
int &&b=a;
Все случаи привязки ссылки (как lvalue-ссылки, так и rvalue-ссылки) к именованному lvalue делятся на две большие категории
  1. Случаи, когда должна выполняться прямая привязка ссылки к этому lvalue, т.е. случаи когда тип исходного lvalue и ссылаемый тип совпадают. Т.е. это привязка ссылок T & или T && к объекту типа T.

    В таких ситуациях создания временного объекта никогда не делается. Попытка привязать неконстантную ссылку к константному объекту считается ошибкой. И вообще привязка rvalue-ссылки к именованному объекту требует явного приведения типа (std::move и т.п.).

  2. Случаи, когда прямая привязка в принципе невозможна, т.к. типы не совпадают. Т.е. это привязка ссылки T & или T && к объекту типа U.

    Вот тут-то и возможно создание временных объектов.

Ваш пример здесь попадает в первую категорию. Ваш исходный пример - во вторую.
1
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149
11.11.2018, 01:35  [ТС]
Справедливо. Согласен, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2018, 01:35
Помогаю со студенческими работами здесь

Указатель на строковую константу
Всем привет. Я знаю что в С++ в основном юзается std::string,но сишные строки тоже желательно знать. Вроде все просто, только функции...

Указатель на строковую константу
Здравствуйте уважаемые форумчане! Подскажите пожалуйста является ли эта ситуация выходом за пределы массива или размер массива...

Ссылка на константу
Приветствую всех. Есть такой код: int fun() { return 777; } const int& i = fun(); Если i - это ссылка, то на какой объект она...

Инициализация ссылка на константу
Почему ссылку на константу можно инициализировать литералом? Ссылка же может быть связана только с объектом.

Константный указатель на константу меняет значение
int d = 7; const int* const cd = &d; d = 8; qDebug()<<*cd;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru