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

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

Войти
Регистрация
Восстановить пароль
 
 
DUMP
57 / 31 / 7
Регистрация: 22.02.2015
Сообщений: 257
#1

Bool & - что это - C++

09.07.2016, 19:58. Просмотров 428. Ответов 20
Метки нет (Все метки)

Что делает здесь амперсанд.
C++
1
bool & hello = test[0][0];
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
09.07.2016, 20:04     Bool & - что это #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от DUMP Посмотреть сообщение
Что делает здесь амперсанд.
Определение ссылки на объект типа bool.
zss
Модератор
Эксперт С++
6184 / 5787 / 1874
Регистрация: 18.12.2011
Сообщений: 14,782
Завершенные тесты: 1
09.07.2016, 20:05     Bool & - что это #3
получается hello - это ссылка на первый элемент массива test
Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
13.07.2016, 12:54     Bool & - что это #4
Если честно, не работает ваше объяснение. &test не равен &h.
Миниатюры
Bool & - что это  
Operok
132 / 130 / 36
Регистрация: 15.02.2015
Сообщений: 404
Завершенные тесты: 2
13.07.2016, 12:58     Bool & - что это #5
Цитата Сообщение от Programmist5 Посмотреть сообщение
Если честно, не работает ваше объяснение. &test не равен &h.
Дело в том, что при взятии адреса переменной типа статического массива она неявно кастится в указатель на первый элемент этого массива, а адрес этой переменной - это адрес указателя на первый элемент массива, который, ясен пень, не равен адресу этого элемента.
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
13.07.2016, 12:59     Bool & - что это #6
Цитата Сообщение от Programmist5 Посмотреть сообщение
не работает ваше объяснение
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    bool test[5][5];
    bool & h = test[0][0];
    std::cout << test << std::endl;
    std::cout << &(test[0][0]) << std::endl;
    std::cout << &h << std::endl;
}
http://rextester.com/PRXN90843
Ваши результаты в студию
Цитата Сообщение от Programmist5 Посмотреть сообщение
&test не равен &h.
А отладчиком пользоваться где учились?
Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
13.07.2016, 13:02     Bool & - что это #7
Цитата Сообщение от Operok Посмотреть сообщение
Дело в том, что при взятии адреса переменной типа статического массива она неявно кастится в указатель на первый элемент этого массива, а адрес этой переменной - это адрес указателя на первый элемент массива, который, ясен пень, не равен адресу этого элемента.
- если честно, не понял Ваше объяснение. Можно простым понятным человеческим языком.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
13.07.2016, 13:02     Bool & - что это #8
Цитата Сообщение от Programmist5 Посмотреть сообщение
&test не равен &h.
Смотря как это объяснение проверять. Ты код-то покажи.
Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
13.07.2016, 13:03     Bool & - что это #9
Ну я же показал скриншот, массив у меня только другой:
C++
1
int test[5][5];
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
13.07.2016, 13:05     Bool & - что это #10
Цитата Сообщение от Programmist5 Посмотреть сообщение
Ну я же показал скриншот
Там нет кода.
Цитата Сообщение от Programmist5 Посмотреть сообщение
массив у меня только другой
Эм... а может совсем всё по другому и язык Java?
Сейчас это выглядит так:
- Ребята, у меня машина сломалась.
- Все четыре колеса накачал?
- Какие 4 колеса? У меня мотоцикл на двух.
Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
13.07.2016, 13:07     Bool & - что это #11
Неостроумно.
C++
1
2
int test[5][5];
bool &h = test[0][0];
Вот и весь код. Показал же ведь уже. Среда - C++Builder 6.
Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
13.07.2016, 13:11     Bool & - что это #12
Еще раз.
Миниатюры
Bool & - что это  
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
13.07.2016, 13:13     Bool & - что это #13
Programmist5, подобного рода код не должен компилироваться. На это есть ряд совершенно четких, прописанных в стандарте языка, ограничений.

Но я объясню что, тем не менее, произошло. Компилятор не может здесь выполнить инициализацию ссылки тем же объектом, который находится в массиве с индексами (0,0). Не может, потому что типы - разные. И размеры у них могут быть в общем случае - разные. Поэтому компилятор здесь сделал временный объект, типа bool, который он получил (неявным) приведением типа int -> bool. Естественно адрес этого объекта будет другим.

Т.е. твой код приблизительно эквивалентен такому:
C++
1
2
3
int test[5][5];
bool tmp = test[0][0];
bool & h = tmp;
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
13.07.2016, 13:18     Bool & - что это #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Programmist5 Посмотреть сообщение
Неостроумно.
А показывать никак не связанные друг с другом текст и код - очень остроумно.
Цитата Сообщение от Programmist5 Посмотреть сообщение
Показал же ведь уже.
В каком месте?
Только по кускам и то после того, как тыкнули.


Что касается ссылки.
test[0][0] - имеет тип int
ссылку хотите создать на bool,
компилятор создает некий временный объект типа bool,
со значением true/false в зависимости от значения test[0][0],
затем в h пихается ссылка на этот объект.
Так что test[0][0] и то, на что ссылается Ваша ссылка - разные объекты,
потому и адреса разные.
Был бы массив bool, адреса были бы одинаковые.
Теперь понятна причина "остроумия"?

И, да, как оно скомпилировалось, ссылка же не константная?

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
подобного рода код не должен компилироваться.
а я уж думал, что я что-то путаю )))
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
13.07.2016, 13:30     Bool & - что это #15
Цитата Сообщение от Croessmah Посмотреть сообщение
а я уж думал, что я что-то путаю )))
Что интересно, если тот код у него компилируется, значит и этот должен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
void foo(bool & r)
{
    r = 1;
}
 
int main()
{
    int test[1][1] = { 0 };
    foo(test[0][0]);
    std::cout << test[0][0] << std::endl;
}
Этот код выведет 0, если будет скомпилирован. Тем самым проиллюстрирует проблему, которую описал Страуструп в книжке "Дизайн и эволюция С++" в качестве объяснения запрета на компиляцию такого кода.
Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
13.07.2016, 16:39     Bool & - что это #16
Вот этот код у меня уже не компилируется:
C++
1
2
int c[5][5];
bool &h = c[0][0];
- этот код я попробовал в консольном(новом) приложении и он не компилируется, а тот код был в оконном приложении и компилировался. Тот код: инициализация массива в верхних строках, т.е. до функций, создание и присвоение ссылки в обработчике OnClick кнопки 1.
Ну я понял примерно в чем проблема: 2 разных типа совместил int и bool и отсюда все косяки. Так я и думал.

Добавлено через 10 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Что интересно, если тот код у него компилируется, значит и этот должен:
- да, этот код компилируется, но достаточно исправить int на bool в 10-й строке и все работает, как и в начальном примере!
hoggy
5980 / 2420 / 433
Регистрация: 15.11.2014
Сообщений: 5,370
Завершенные тесты: 1
13.07.2016, 17:10     Bool & - что это #17
Цитата Сообщение от DrOffset Посмотреть сообщение
если тот код у него компилируется
нестандартное расширения компилятора от вижуал студии:
позволяет создавать мутабельные ссылки от временных объектов.
но при этом кидает соответствующее предупреждение.

хотя судя по скриншоту - это нефига не Каель.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
13.07.2016, 17:14     Bool & - что это #18
Цитата Сообщение от hoggy Посмотреть сообщение
нестандартное расширения компилятора от вижуал студии
Было сказано, что он пробует в С++ Builder.
Ну и я знаю про это расширение естественно, только вот в Студии это сделано намеренно и все равно не разрешается для POD, только для пользовательских типов. А тут мы видим что разрешается всегда, а это больше похоже на баг или очень старую реализацию, опирающуюся на первую документацию по языку, в которой это было разрешено.
rikimaru2013
C++ Game Dev
2350 / 1056 / 232
Регистрация: 30.11.2013
Сообщений: 3,499
13.07.2016, 19:16     Bool & - что это #19
DrOffset, а зачем извращаться с bool& стандарту? Им std::vector<bool> оказалось мало?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2016, 19:29     Bool & - что это
Еще ссылки по теме:

Что это за знак >> прочитал что это сдвиг вправо? что он делает C++
C++ Что это значит if (x&1) ?
C++ Изменить значение bool a = true в bool a = false
Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) C++
Void vs bool или что то похожие C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
13.07.2016, 19:29     Bool & - что это #20
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а зачем извращаться с bool& стандарту?
Что?!
Если ты о создании временной переменной, то это общее правило к bool & отношения не имеющее.
Yandex
Объявления
13.07.2016, 19:29     Bool & - что это
Ответ Создать тему
Опции темы

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