Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 10

Константая ссылка на неконстанту

09.03.2014, 13:46. Показов 2130. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема много где обсуждалась, но белые пятна всё же есть.
Просьба знающим объяснить механизм и смысл явления:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class FooClass
{
private:
   bool OK_private;
public:
   const bool& OK_public = OK_private;
}
 
void FooFunc()
{
   FooClass* FC = new FooClass();
   FC->OK_public = true;
}
Компилятор это пропускает без помарок...
А если написать:

C++
1
2
3
4
5
6
void BarFunc()
{
   bool OK_var;
   const bool& OK_const = OK_var;
   OK_const = true;
}
то это - однозначная ошибка!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2014, 13:46
Ответы с готовыми решениями:

Если нет файла, но есть ссылка, то будет отображаться ссылка на указанную страницу...
Здравствуйте, понадобилась помощь в php)) В общем есть такой код: <?php $file = get_field('file'); $title = $file; if(...

Как перенести продублировать данные из справочника.ЕдиницыИзмерения.Ссылка в справочник КлассификаторЕдиницИзмерения.Ссылка
Ну вапрос таков есть два справочника 1)КлассификаторЕдиницИзмерения и 2) ЕдиницыИзмерения нужна сделать так что бы у них были индоинтичные...

Что лучше сквозная ссылка или одна статейная ссылка с одного домена?
Что лучше сквозная ссылка или одна статейная ссылка с одного домена?

10
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.03.2014, 13:54
ссылки сами по себе являются константами.
при их создании нужно указать на что они ссылаются и после
это уже поменять нельзя. они всегда будут ссылаться в то место,
которое при конструировании указали.
поэтому тип const bool& - это ссылка на константу (константная ссылка на константу если хотите).
т.к. константу менять запрещается - получаем ошибку.

И мне не очень понятно как у вас первый пример заработал. Глюк какой-то.
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 10
09.03.2014, 14:07  [ТС]
Ничего подобного!
Код:
C++
1
2
3
4
5
6
7
8
9
void BarFunc()
{
   bool OK_var;
   const bool& OK_const = OK_var;
   OK_var = true;
   printf("%s %s", OK_var ? "true" : "false", OK_const ? "true" : "false");
   OK_var = false;
   printf("%s %s", OK_var ? "true" : "false", OK_const ? "true" : "false");
}
- работает! И выводит:
true true
false false
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.03.2014, 14:10
ну так вы меняете значение не через константную ссылку а саму переменную,
на которую она ссылается. в этом случае все логично.
объект нельзя поменять через ссылку.
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 10
09.03.2014, 14:16  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
поэтому тип const bool& - это ссылка на константу (константная ссылка на константу если хотите)
В общем, ссылка не на константу, как получилось
Но суть не в этом - попробуйте первый пример себе в компилятор. У меня VS2013. Я не проверял будет ли ошибка выполнения, так как это не особо меняет ситуацию. Мне вполне хватило, что проект с аналогичным кодом собрался без замечаний
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.03.2014, 14:23
бывают случаи, на которые студия смотрит сквозь пальцы, хотя стандарт
эти случаи явно запрещает. но этот - это ахтунг какой-то.
2013 студии не имею. есть 2012. пришлось немного модифицировать,
чтобы собралось. выдает законную ошибку о попытке изменить константу.
онлайн gcc компилятор аналогичную выдает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class FooClass
{
private:
   bool OK_private;
 
public:
   const bool& OK_public;
 
public:
  FooClass()
    : OK_public(OK_private)
  {
  }
};
 
int main()
{
  FooClass* FC = new FooClass();
  FC->OK_public = true;
  return 0;
}
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.03.2014, 14:25
Цитата Сообщение от traregs Посмотреть сообщение
Мне вполне хватило, что проект с аналогичным кодом
Видимо, что-то потеряли. Как уже сказали выше, ошибка компиляции. Может, там ссылка на константный указатель, который указывает на неконстантные данные или еще какой изврат?
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 10
09.03.2014, 14:44  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
или еще какой изврат?
Весь код привести не получится, так как оно в большом проекте, но ситуация вырезана дословно, никаких больше извратов. Я просто решил попробовать сделать поле, доступное на запись членам и на чтение извне. Ну и - по привычке проверил, получилась ли извне именно константа. А оно взяло и собралось
Есть ещё одно подозрение - пока не проверял:
у меня public переменная называлась просто OK
Может быть оно - какое-то ключевое слово, и поэтому компилятор дурит.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.03.2014, 14:58
Цитата Сообщение от traregs Посмотреть сообщение
А оно взяло и собралось
Видимо есть какое-то отличие м/у кодом из "большого проекта" и кодом, приведенным здесь.
Цитата Сообщение от traregs Посмотреть сообщение
поле, доступное на запись членам и на чтение извне.
Обычный подход: это приватное поле и геттер к нему.
Цитата Сообщение от traregs Посмотреть сообщение
Может быть оно - какое-то ключевое слово, и поэтому компилятор дурит.
Нет такого ключевого слова OK.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.03.2014, 14:59
traregs,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class FooClass
{
private:
   bool OK_private;
public:
   const bool& OK_public = OK_private;
};
 
void FooFunc()
{
   FooClass* FC = new FooClass();
   FC->OK_public = true;
}
Вот этот твой пример, собери отдельно, если не собирал, и убедишься, что будет ошибка компиляции.
Ссылка - это псевдоним для переменной, если ссылка константная, то через нее нельзя менять переменную. Если ссылка неконстантная, то можно. Причем неконстантную ссылку на константный объект нельзя создать. А константную ссылку на неконстантный объект - можно, в этом случае через сам объект можно будет менять значение, а через ссылку - нет.

Скорее всего не компилятор дурит, а ты сделал что-то не так, как нам рассказываешь. Возможно даже не подозревая об этом.
0
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 10
09.03.2014, 17:52  [ТС]
Пересобрал. Глюки - исчезли. Невероятно, что за фантом вчера был!
Теперь чётко выдаёт: "error C3892: FC: невозможно присваивать значения переменной, которая объявлена как константа" или "error C2166: левостороннее значение указывает на объект-константу (const)"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.03.2014, 17:52
Помогаю со студенческими работами здесь

Как проверить - есть ли обратная ссылка ссылка?
Добрый вечер! Есть сайт. Обменялся год назад с другими сайтами ссылками. Сейчас хочу проверить - у всех ли этих сайтов сохранились...

Загаловок как ссылка - но не ссылка в статье
Как думаете, можно сделать кликабельные загаловки как тут? http://tut.by/ - то есть на главной странице или в любом разделе все загаловки...

Ссылка, гиперссылка и перекрёстная ссылка
Это одно и то же? Кто что думает об этом? В чём разница между ними?

из ссылки "хттпс://ссылка.ру/комбо1234" скопировать в переменную то, что будет после "хттпс://ссылка.ру/"
как из ссылки "хттпс://ссылка.ру/комбо1234" скопировать в переменную то, что будет после "хттпс://ссылка.ру/" Добавлено...

{(14, 21)}: Неоднозначное поле "Заказ.Ссылка" ПО Оплата.Заказ = <<?>>Заказ.Ссылка
Здравствуйте! Я создал печатную форму документа Оплаты. Билеты должны формироваться в соответствии с данными в табличной части Заказа. ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru