88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
||||||
1 | ||||||
&& ссылки на r-value01.04.2016, 10:05. Показов 7060. Ответов 6
Метки нет (Все метки)
Плохо понял что из себя представляют ссылки r-value.
Но чем именно являются отдельно определенные ссылки r-value не понял. И вообще, они где-нибудь используются именно в таком виде, чтоб определить например string &&z? Чем она дальше будет отличаться от обычной переменной типа string? Буду рад любым комментариям.
0
|
01.04.2016, 10:05 | |
Ответы с готовыми решениями:
6
Ошибка: multiple definition of `void std::swap<A>(A&, A&) Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9& ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? |
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
|
|
01.04.2016, 12:33 | 2 |
Сообщение было отмечено yrceus как решение
Решение
Не только. Во-первых, перемещения бывают не только в конструкторе. Само перемещение вы реализуете своими руками. Где вы реализуете перемещение - там оно и будет.
Во-вторых, perfect forwarding - тоже цель rvalue-ссылок. В-третьих, может какие еще применения удастся им найти. Вот Мейерс предлагает концепцию universal reference. Ссылкой. Именованная rvalue ссылка - это просто lvalue, как и обычная ссылка. В определении отдельностоящей rvalue-ссылки не больше смысла, чем в определении отдельностоящей обычной (lvalue) ссылки, с той только разницей, что rvalue-ссылка может привязываться к rvalue, не имея при этом квалификатора const. (Обычная ссылка должна быть const, чтобы привязываться к rvalue). На концептуальном уровне - ничем. (На физическом уровне, понятное дело, она может оказаться указателем.) Точно так же обычная const string &r = string("abc"); ссылка внешне не отличается от const string s("abc"); переменной. Только в случае rvalue-ссылки const - не обязателен.
1
|
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
||||||||||||||||
02.04.2016, 11:36 [ТС] | 3 | |||||||||||||||
Фух, статью Мейерса осилил, можно сказать что понял. Понял, что если для && ссылки происходит выведение типа, то это в большинстве случаев универсальная ссылка. Мотаю на ус
Так же существует сжатие ссылок:
Добавлено через 17 часов 8 минут TheCalligrapher, буквально на секунду вернуться к теме. Вы написали,
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
||||||
02.04.2016, 11:59 | 4 | |||||
Имеется в виду, например, swap:
1
|
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
||||||
02.04.2016, 12:20 [ТС] | 5 | |||||
Да, а если объекты типа T не имеют конструктора перемещения и он не синтезирован компилятором? То произойдет обычное копирование?
То есть перемещение все равно в конструкторе перемещения происходит, да? Так или иначе. И для простых типов функция move() бесполезна, просто приведет их значение к типу &&. (не бесполезна, но в данном случае не отработает как ожидается)
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
|
||||||
02.04.2016, 22:17 | 6 | |||||
Сообщение было отмечено yrceus как решение
Решение
Не совсем понимаю, что вы хотите здесь сказать. Во-первых, перемещенеим объекта занимается, например, перемещающий оператор присваивания. И никакоих конструкторов в этом процессе не участвует. Это уже сразу говорит о том, что перемещение возможно без конструктора перемещения.
Во-вторых, никто вам не запрещает написать свою функцию
src и переместите их в объект dst . Никаких конструкторов, никаких операторов присваивания.Более того, еще раз, все это мы уже давно делали и в классическом C++, и в С. Вопрос был только в том, какие выработать соглашения и как описать семантику фукнций, чтобы пользователь был в курсе, что призойдет при вызове функции. Каждый делал это по-своему. Все, что появилось с появлением официальой концепции move semantics - это набор стандартизованных примитивов, которые своей стандартизованностью должны облегчать написание/понимание кода. Плюс они своей стандартизованностью позволяют и компилятору пользоваться преимуществами move semantics для ваших типов (если вы ее реализовали). Добавлено через 2 минуты Функция std::move для всех типов делает только то, что приводит значение к типу &&. Что происходит с типом && в правой части присваивания и инициализации зависит от свойств типа. Для скалярных типов происходит просто копирование значения.
1
|
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
|
02.04.2016, 23:39 [ТС] | 7 |
Отлично, спасибо! Объяснили, поправили и подтвердили, остается только запомнить
0
|
02.04.2016, 23:39 | |
02.04.2016, 23:39 | |
Помогаю со студенческими работами здесь
7
Порядок вычисления: операторы «|» и «||», «&» и «&&» C2280 "bulb &bulb::operator =(const bulb &)": предпринята попытка ссылки на удаленную функцию Friend ostream& operator<<(ostream& stream, CArr& obj); Создать функцию с параметрами GetFunctionValue(double& a, double& b, double& c, double& x)... Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |