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

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

04.02.2016, 20:31. Показов 4768. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2016, 20:31
Ответы с готовыми решениями:

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

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

Нюансы синтаксиса: для чего нужен оператор ->
Здравствуйте совсем недавно столкнулся с вот таким вот оператором. -> . Подскажите пожалуйста, что он делает? card *bus_park(nullptr);...

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

Решение

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

Решение

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

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

Не по теме:

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

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

Решение

Цитата Сообщение от Vlad3 Посмотреть сообщение
То есть можно создавать объект Foo через переменную или константу? Вроде понятно
Это же C++! Тут всё неоднозначно и не всегда понятно
Выражение с применением && может быть также универсальной ссылкой,
принимающей как правосторонее выражение, так и левостороннее.
Скотт Мейерс книжку написал по новым возможностям C++.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
04.02.2016, 21:55
Цитата Сообщение от EVP Посмотреть сообщение
Тут всё неоднозначно и не всегда понятно
конкретно тут - всё понятно.
В данном случае нет автоматического вывода типа,
следовательно всегда rvalue-reference
1
04.02.2016, 22:38

Не по теме:

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

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

Добавлено через 9 минут
Да уже понял.
Цитата Сообщение от EVP Посмотреть сообщение
Тут всё неоднозначно и не всегда понятно
Сложная тема.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.02.2016, 13:18
Цитата Сообщение от EVP Посмотреть сообщение
добавление про универсальные ссылки союзом также очевидно станет.
Мейерс придумал этот термин.
Видимо, зря он это сделал,
потому как все стали думать, что такие ссылки есть.
НЕТ НИКАКИХ УНИВЕРСАЛЬНЫХ ССЫЛОК!!!
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
05.02.2016, 13:27
Цитата Сообщение от 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
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
05.02.2016, 13:28
Цитата Сообщение от Vlad3 Посмотреть сообщение
Может кто на пальцах объяснить когда нужно использовать ссылку на ссылку?
C++
Могу и объяснить. Только, вот нафига это в твоей задачке? Сссылка на ссссылку, применяется в дерерьях. Если жестокой нет необходимости, не пользуйся этим. Гемола наживёшь, на всю оставшуся жизнь.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
05.02.2016, 13:32
Цитата Сообщение от SmittWesson Посмотреть сообщение
Сссылка на ссссылку, применяется в дерерьях.
В С++ нет ссылок на ссылки. Указатель на указатель есть, но ссылки на ссылку нет.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.02.2016, 13:35
Цитата Сообщение от Kastaneda Посмотреть сообщение
Судя по контексту он называет универсальными ссылки, которые используются в шаблонах.
Универсальными ссылками он назвал для упрощения такое:
C++
1
2
template<typename T>
void (T&& r){/*...*/}
и там происходит автоматический вывод типа.
Соответственно, если нам дали rvalue, то тип T не будет ссылкой,
а значит r будет именно Type&&.
А если дали на вход lvalue, то получим тип T равный Type&.
А здесь дальше уже ссылка будет "свернута" до lvalue-ссылки.
Так что тут играет роль тип Т, и rvalue-ссылка, которая успешно прихлопнется,
а не какие-то "универсальные" ссылки.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Думаю в стандарте все же этого термина не встретишь.
конечно нет.
0
05.02.2016, 13:37

Не по теме:

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

0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.02.2016, 13:46
Kastaneda, кстати, из книги Майерса:
Имейте в виду, что весь этот раздел - основы универсальных ссылок - является лож . . . простите, абстракцией. Лежащая в основе истина, известная как свертывание ссылок (reference collapsing), является темой раздела 5.6.
Ну и далее он там говорит, что так удобнее.
Да, может и удобнее. Но вот беда,
В разделе 5.3 поясняется, что к универсальным ссылкам почти всегда может применяться std :: forward, так что, когда эта книга готовилась к печати, некоторые члены сообщества С++ начинали именовать универсальные ссылки передаваемыми ссылками.
Так универсальные или передаваемые?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.02.2016, 13:58
Видимо он имел в виду reference collapsing rules.
C++
1
2
3
4
    A &   & becomes A &
    A &  && becomes A &
    A &&  & becomes A &
    A && && becomes A &&
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
05.02.2016, 14:25
Ещё интересный пример:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2016, 14:25
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru