Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 12
1

Нюансы синтаксиса: где, как и для чего используется &&

04.02.2016, 20:31. Показов 2776. Ответов 21
Метки нет (Все метки)

Когда применяется ссылка на ссылку? В STL есть классы, конструкторы которых принимают ссылку на ссылку.
Попробовал понять для чего они нужны и написал простой класс с двумя конструкторами. Один конструктор принимает ссылку, другой ссылку на ссылку. Только так и не понял в чем разница.
Может кто на пальцах объяснить когда нужно использовать ссылку на ссылку?

C++
1
2
3
4
5
6
7
8
9
class Foo
{
public:
    Foo(int &n) { this->n = n; }
    Foo(int &&n) { this->n = n; }
 
private:
    int n;
};
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2016, 20:31
Ответы с готовыми решениями:

Нюансы синтаксиса: оператор & после переменной
Здравствуйте, разбираю исходник одной программы, не могу понять, что означает оператор & после...

Нюансы синтаксиса: объяснить смысл записи (struct sockaddr *)&their_addr
Что означает вот такая запись? Если можно, то объясните словами. (struct sockaddr *)&their_addr

Нюансы синтаксиса: для чего нужен оператор ->
Здравствуйте совсем недавно столкнулся с вот таким вот оператором. -> . Подскажите пожалуйста, что...

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;)
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H ...

21
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
04.02.2016, 20:35 2
Цитата Сообщение от Vlad3 Посмотреть сообщение
Когда применяется ссылка на ссылку?
Это не ссылка на ссылку, а ссылка на правостороннее выражение (r-value reference), грубо говоря - ссылка на временной объект.
1
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 12
04.02.2016, 20:45  [ТС] 3
Цитата Сообщение от castaway Посмотреть сообщение
ссылка на правостороннее выражение
То есть можно создавать объект Foo через переменную или константу? Вроде понятно
C++
1
2
3
int n = 5;
Foo foo(n);
Foo foo2(5);
0
58 / 45 / 11
Регистрация: 16.09.2014
Сообщений: 124
04.02.2016, 20:45 4
Дополнительно стоит почитать о move семантике. Это одно из мест применения.
1
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 12
04.02.2016, 20:46  [ТС] 5
А я в Google набирал "ссылка на ссылку". И результатов почти никаких.))
0
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
04.02.2016, 21:03 6
Лучший ответ Сообщение было отмечено Vlad3 как решение

Решение

https://habrahabr.ru/post/226229/
1
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
04.02.2016, 21:08 7
Лучший ответ Сообщение было отмечено Vlad3 как решение

Решение

Цитата Сообщение от Vlad3 Посмотреть сообщение
То есть можно создавать объект Foo через переменную или константу?
Нет. Скорее она введена для оптимизации. Например, с её помощью можно перенести содержимое одного вектора (std::vector) в другой без копирования всех элементов, а просто присвоив новому вектору указатель на элементы и его размер, а старый вектор сделать пустым, т.е. можно изменить объект по "правую руку".

Добавлено через 3 минуты

Не по теме:

Ну и название темы у тебя конечно интересное... "Что такое ссылка ссылку?"
Собака собаку, человек человека видел. Ссылка ссылку - нет.

2
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
04.02.2016, 21:42 8
Лучший ответ Сообщение было отмечено Vlad3 как решение

Решение

Цитата Сообщение от Vlad3 Посмотреть сообщение
То есть можно создавать объект Foo через переменную или константу? Вроде понятно
Это же C++! Тут всё неоднозначно и не всегда понятно
Выражение с применением && может быть также универсальной ссылкой,
принимающей как правосторонее выражение, так и левостороннее.
Скотт Мейерс книжку написал по новым возможностям C++.
1
Don't worry, be happy
17172 / 10055 / 1935
Регистрация: 27.09.2012
Сообщений: 25,053
Записей в блоге: 1
04.02.2016, 21:55 9
Цитата Сообщение от EVP Посмотреть сообщение
Тут всё неоднозначно и не всегда понятно
конкретно тут - всё понятно.
В данном случае нет автоматического вывода типа,
следовательно всегда rvalue-reference
1
EVP
04.02.2016, 22:38
  #10

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
конкретно тут - всё понятно.
Получилось неоднозначно, согласен.
У меня тут относится к C++, а не к коду примера ТС.
Надо было мне исходный вопрос ещё процитировать, на который я фактически отвечал:
Цитата Сообщение от Vlad3 Посмотреть сообщение
Когда применяется ссылка на ссылку?
Тогда после ответа про ссылку на правосторонее значение:
Цитата Сообщение от Vlad3 Посмотреть сообщение
То есть можно создавать объект Foo через переменную или константу? Вроде понятно
добавление про универсальные ссылки союзом также очевидно станет.

0
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 12
05.02.2016, 13:02  [ТС] 11
Цитата Сообщение от castaway Посмотреть сообщение
Ссылка ссылку - нет.
Оказывается я не первый такой https://www.cyberforum.ru/post5433144.html

Добавлено через 9 минут
Да уже понял.
Цитата Сообщение от EVP Посмотреть сообщение
Тут всё неоднозначно и не всегда понятно
Сложная тема.
0
Don't worry, be happy
17172 / 10055 / 1935
Регистрация: 27.09.2012
Сообщений: 25,053
Записей в блоге: 1
05.02.2016, 13:18 12
Цитата Сообщение от EVP Посмотреть сообщение
добавление про универсальные ссылки союзом также очевидно станет.
Мейерс придумал этот термин.
Видимо, зря он это сделал,
потому как все стали думать, что такие ссылки есть.
НЕТ НИКАКИХ УНИВЕРСАЛЬНЫХ ССЫЛОК!!!
1
Jesus loves me
Эксперт С++
5189 / 3157 / 355
Регистрация: 12.12.2009
Сообщений: 7,974
Записей в блоге: 2
05.02.2016, 13:27 13
Цитата Сообщение от Croessmah Посмотреть сообщение
НЕТ НИКАКИХ УНИВЕРСАЛЬНЫХ ССЫЛОК!!!
вот как раз его (Мейерса) статья. Судя по контексту он называет универсальными ссылки, которые используются в шаблонах. Т.е. в зависимости от реального типа она может быть как ссылкой на lavalue так и на rvalue, отсюда и название "универсальная".

Добавлено через 1 минуту
universal reference – a reference that may resolve to either an lvalue reference or an rvalue reference. Universal references always have the form T&& for some deduced type T.
Думаю в стандарте все же этого термина не встретишь.
1
236 / 195 / 21
Регистрация: 04.06.2014
Сообщений: 1,313
05.02.2016, 13:28 14
Цитата Сообщение от Vlad3 Посмотреть сообщение
Может кто на пальцах объяснить когда нужно использовать ссылку на ссылку?
C++
Могу и объяснить. Только, вот нафига это в твоей задачке? Сссылка на ссссылку, применяется в дерерьях. Если жестокой нет необходимости, не пользуйся этим. Гемола наживёшь, на всю оставшуся жизнь.
1
Jesus loves me
Эксперт С++
5189 / 3157 / 355
Регистрация: 12.12.2009
Сообщений: 7,974
Записей в блоге: 2
05.02.2016, 13:32 15
Цитата Сообщение от SmittWesson Посмотреть сообщение
Сссылка на ссссылку, применяется в дерерьях.
В С++ нет ссылок на ссылки. Указатель на указатель есть, но ссылки на ссылку нет.
0
Don't worry, be happy
17172 / 10055 / 1935
Регистрация: 27.09.2012
Сообщений: 25,053
Записей в блоге: 1
05.02.2016, 13:35 16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Судя по контексту он называет универсальными ссылки, которые используются в шаблонах.
Универсальными ссылками он назвал для упрощения такое:
C++
1
2
template<typename T>
void (T&& r){/*...*/}
и там происходит автоматический вывод типа.
Соответственно, если нам дали rvalue, то тип T не будет ссылкой,
а значит r будет именно Type&&.
А если дали на вход lvalue, то получим тип T равный Type&.
А здесь дальше уже ссылка будет "свернута" до lvalue-ссылки.
Так что тут играет роль тип Т, и rvalue-ссылка, которая успешно прихлопнется,
а не какие-то "универсальные" ссылки.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Думаю в стандарте все же этого термина не встретишь.
конечно нет.
0
Kastaneda
05.02.2016, 13:37
  #17

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
и там происходит автоматический вывод типа.
Соответственно, если нам дали...
Да, я это и имел ввиду

0
Don't worry, be happy
17172 / 10055 / 1935
Регистрация: 27.09.2012
Сообщений: 25,053
Записей в блоге: 1
05.02.2016, 13:46 18
Kastaneda, кстати, из книги Майерса:
Имейте в виду, что весь этот раздел - основы универсальных ссылок - является лож . . . простите, абстракцией. Лежащая в основе истина, известная как свертывание ссылок (reference collapsing), является темой раздела 5.6.
Ну и далее он там говорит, что так удобнее.
Да, может и удобнее. Но вот беда,
В разделе 5.3 поясняется, что к универсальным ссылкам почти всегда может применяться std :: forward, так что, когда эта книга готовилась к печати, некоторые члены сообщества С++ начинали именовать универсальные ссылки передаваемыми ссылками.
Так универсальные или передаваемые?
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
05.02.2016, 13:58 19
Видимо он имел в виду reference collapsing rules.
C++
1
2
3
4
    A &   & becomes A &
    A &  && becomes A &
    A &&  & becomes A &
    A && && becomes A &&
0
672 / 288 / 99
Регистрация: 04.07.2014
Сообщений: 810
05.02.2016, 14:25 20
Ещё интересный пример:
ndn-cxx Code Style and Coding Guidelines
3.29. auto type specifier MAY be used for local variables, if a human reader

...

C++
1
2
3
4
5
6
7
8
std::list<std::string> strings;
 
for (const auto& str : strings) {
  statements; // cannot modify `str`
}
for (auto&& str : strings) {
  statements; // can modify `str`
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2016, 14:25

Нюансы синтаксиса: объяснить что происходит в заданных строках кода и для чего нужны указанные конструкции
Наткнулся на урок по C++ в интернете, где был пример с перебором &quot;телефонной книги&quot;. Вот кусок...

Где используются логические операторы && и ||
Скажите пожалуйста а логические операторы такие как и &amp;&amp;, или ||,не !,можно использовать только в...

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const...

Почему для обозначения ссылок используется именно символ &?
Почему для обозначения ссылок используется именно символ &amp;, а не какой-то другой? Ведь сам по себе...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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