Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
traregs
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 9
#1

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

09.03.2014, 13:46. Просмотров 509. Ответов 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;
}
то это - однозначная ошибка!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2014, 13:46     Константая ссылка на неконстанту
Посмотрите здесь:

Указатель и ссылка - C++
Помогите понять, немного запутался. #include<iostream> using namespace std; void ch1 (int *pa1); int main() {

Не найдена ссылка - C++
В программе использую WinAPI, как надо подключаю заголовочныq файл #include <windows.h> Далее пишу функцию для рисования линий ...

Ссылка в функции - C++
Как сделать чтобы вот эту функцию void CheckOfMatrix(ifstream File) Можно было бы открыть так: CheckOfMatrix(FirstFile); Пишет что...

Ссылка и Разыменование в с++ - C++
прошу кто можеть дать видеоурок(или что угодно) на эту тему.я очень затрудняюсь понят это.нужно много примеров из самого примитива до...

Ссылка на указатель - C++
Задам, скорее всего, глупый вопрос, однако хотелось бы разобраться. // ... { int *ptr = new int; int &x = *ptr; } ...

Ссылка на файл - C++
Приветствую всех. У меня небольшой вопрос... Есть код: g_hInputFile = CreateFile( (LPCWSTR)"C://a.txt", ...

Ссылка на ссылку - C++
Можно ли говорить, что t это ссылка на ссылку? int y=2; int &q=y; int& t = q;

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

И мне не очень понятно как у вас первый пример заработал. Глюк какой-то.
traregs
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 9
09.03.2014, 14:07  [ТС]     Константая ссылка на неконстанту #3
Ничего подобного!
Код:
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
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.03.2014, 14:10     Константая ссылка на неконстанту #4
ну так вы меняете значение не через константную ссылку а саму переменную,
на которую она ссылается. в этом случае все логично.
объект нельзя поменять через ссылку.
traregs
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 9
09.03.2014, 14:16  [ТС]     Константая ссылка на неконстанту #5
Цитата Сообщение от DU Посмотреть сообщение
поэтому тип const bool& - это ссылка на константу (константная ссылка на константу если хотите)
В общем, ссылка не на константу, как получилось
Но суть не в этом - попробуйте первый пример себе в компилятор. У меня VS2013. Я не проверял будет ли ошибка выполнения, так как это не особо меняет ситуацию. Мне вполне хватило, что проект с аналогичным кодом собрался без замечаний
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.03.2014, 14:23     Константая ссылка на неконстанту #6
бывают случаи, на которые студия смотрит сквозь пальцы, хотя стандарт
эти случаи явно запрещает. но этот - это ахтунг какой-то.
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;
}
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
09.03.2014, 14:25     Константая ссылка на неконстанту #7
Цитата Сообщение от traregs Посмотреть сообщение
Мне вполне хватило, что проект с аналогичным кодом
Видимо, что-то потеряли. Как уже сказали выше, ошибка компиляции. Может, там ссылка на константный указатель, который указывает на неконстантные данные или еще какой изврат?
traregs
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 9
09.03.2014, 14:44  [ТС]     Константая ссылка на неконстанту #8
Цитата Сообщение от 0x10 Посмотреть сообщение
или еще какой изврат?
Весь код привести не получится, так как оно в большом проекте, но ситуация вырезана дословно, никаких больше извратов. Я просто решил попробовать сделать поле, доступное на запись членам и на чтение извне. Ну и - по привычке проверил, получилась ли извне именно константа. А оно взяло и собралось
Есть ещё одно подозрение - пока не проверял:
у меня public переменная называлась просто OK
Может быть оно - какое-то ключевое слово, и поэтому компилятор дурит.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.03.2014, 14:58     Константая ссылка на неконстанту #9
Цитата Сообщение от traregs Посмотреть сообщение
А оно взяло и собралось
Видимо есть какое-то отличие м/у кодом из "большого проекта" и кодом, приведенным здесь.
Цитата Сообщение от traregs Посмотреть сообщение
поле, доступное на запись членам и на чтение извне.
Обычный подход: это приватное поле и геттер к нему.
Цитата Сообщение от traregs Посмотреть сообщение
Может быть оно - какое-то ключевое слово, и поэтому компилятор дурит.
Нет такого ключевого слова OK.
DrOffset
6920 / 4113 / 941
Регистрация: 30.01.2014
Сообщений: 6,908
09.03.2014, 14:59     Константая ссылка на неконстанту #10
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;
}
Вот этот твой пример, собери отдельно, если не собирал, и убедишься, что будет ошибка компиляции.
Ссылка - это псевдоним для переменной, если ссылка константная, то через нее нельзя менять переменную. Если ссылка неконстантная, то можно. Причем неконстантную ссылку на константный объект нельзя создать. А константную ссылку на неконстантный объект - можно, в этом случае через сам объект можно будет менять значение, а через ссылку - нет.

Скорее всего не компилятор дурит, а ты сделал что-то не так, как нам рассказываешь. Возможно даже не подозревая об этом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2014, 17:52     Константая ссылка на неконстанту
Еще ссылки по теме:

Ссылка на структуру - C++
Рассматривал пример из книги Праты. Раздел про ссылки на структуры. В книжке был приведён пример, код примера можно увидеть ниже. У меня...

Указатель и ссылка - C++
В общем вопрос достаточно простой, в чём разница указателя и сылки? С одной стороны указатель это отдельный тип, отдельная ячейка в...

Указатель и ссылка - C++
Почему выгодней использовать указатель а не ссылку при использовании массивов?

Константная ссылка - C++
Один из уважаемых мне людей сказал, что в "Дизайн и эволюция С++" писали, что круто писать void fn( T& const name ) Как по мне это...

Ссылка на массив - C++
Необходимо объявить ссылку на массив из нескольких целых.Что представляет из себя такая ссылка и как правильно её объявить?как может ссылка...


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

Или воспользуйтесь поиском по форуму:
traregs
0 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 9
09.03.2014, 17:52  [ТС]     Константая ссылка на неконстанту #11
Пересобрал. Глюки - исчезли. Невероятно, что за фантом вчера был!
Теперь чётко выдаёт: "error C3892: FC: невозможно присваивать значения переменной, которая объявлена как константа" или "error C2166: левостороннее значение указывает на объект-константу (const)"
Yandex
Объявления
09.03.2014, 17:52     Константая ссылка на неконстанту
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru