Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/37: Рейтинг темы: голосов - 37, средняя оценка - 4.73
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

rvalue ссылки

17.12.2019, 11:36. Показов 8490. Ответов 93
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Может кто объяснить зачем нужны rvalue ссылки и как правильно работать с std::move и std::forward?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2019, 11:36
Ответы с готовыми решениями:

Зачем нужны rvalue ссылки, если есть универсальные ссылки
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

Ссылки от rvalue
Доброго времени суток, господа! Начал читать статью про rvalue ссылки на хабре и что-то много вопросов появилось, вот. void...

Rvalue ссылки
Литературу читаю, но доезжаю медленно(если знаете где доступно описано- напишите),тяжело болею умственной анорексией. 1.Так вот о...

93
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 15:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ReYalp Посмотреть сообщение
если я правильно понял то существует тогда 2 варианта преобразование типов ? С помощью конструкторов и операторов ?
Да, правильно.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.12.2019, 15:33
Цитата Сообщение от ReYalp Посмотреть сообщение
то чтобы этот код(без оптимизации ) отработал правильно нужен такой оператор в int ?
как понять что он нужен?
очень просто: без него работать не будет.

нет никакого смысла реализовывать пользовательский оператор приведения в ситуациях,
когда и без него все прекрасно работает.

пользовательский оператор нужен тогда,
когда нужно выполнить какие то необычные действия.
например, привести теплое к мягкому.


допустим есть у тебя супер-пупер новороченный класс строки.

C++
1
2
struct mystring
{};
а у меня есть новореченная супер пупер библиотека:
C++
1
void foo(const char*);
вот незадача: моя библиотека работает только с обычными сишными строками,
и ничего не знает по твой класс строки.


но ничего, говоришь ты, ловкость рук, и никакого мошенничества:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct mystring
{
    operator const char*()const noexcept { return "hello"; }
};
 
void foo(const char* msg)
{
    std::cout << msg;
}
 
 
int main()
{
    mystring s;
    foo(s);
}
без пользовательского operator const char*() такой трюк бы не прокатил.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 15:35  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, правильно.
Вот ,если бы я с самого начала знал.. Мне было слегка непонятен этот оператор но теперь все стало на свои места ) Спасибо большое всем)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 15:37
Цитата Сообщение от ReYalp Посмотреть сообщение
Спасибо большое всем)
Не забудьте прочитать #74. Ради этого все и затевалось.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 15:45  [ТС]
DrOffset, а возможно как-то создать шаблонный оператор приведения типов ? ЧТобы он работал для всех типов(большинства ,ато мало ли)

Добавлено через 2 минуты
что-то типа
C++
1
2
3
4
template<class T>
     operator T(){
     return T();
    }
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 15:53
Цитата Сообщение от ReYalp Посмотреть сообщение
а возможно как-то создать шаблонный оператор приведения типов ?
Да.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 15:57  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Да.
есть пример где-то?

Добавлено через 1 минуту
DrOffset, Если что под "шаблонный" я имел ввиду не такой же о котором все время речь шла ,а "универсальный"
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 15:57
Цитата Сообщение от ReYalp Посмотреть сообщение
есть пример где-то?
Вы сами его и написали выше. Вполне подходит как пример.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 16:04  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы сами его и написали выше. Вполне подходит как пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Widget {
    Widget(){}
    Widget(int) {std::cout<<"int ctor\n";}
    Widget(const Widget& wg){std::cout<<"copy\n";}
    
};
 
 struct Widget1{
    Widget1(){std::cout<<"ctor1\n";}
     template<class T>
     operator T(){
     return T();
    }
};
как его вызвать в даном случае?
чтобы было что-то типа
C++
1
2
3
4
5
int main()
{
    Widget1 wd;
    Widget w1(wd);
}
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 16:09
Цитата Сообщение от ReYalp Посмотреть сообщение
как его вызвать в даном случае?
У вас тут неоднозначность.
Одинаково хорошо подходит конструктор для int (T = int в operator T)
и конструктор для Widget const & (T = Widget в operator T)

Чтобы ваш код сработал, нужно эту неоднозначность устранить, например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct Widget {
    Widget(){}
    explicit Widget(int) {std::cout<<"int ctor\n";}
    Widget(const Widget& wg){std::cout<<"copy\n";}
    
};
 
 struct Widget1{
    Widget1(){std::cout<<"ctor1\n";}
     template<class T>
     operator T(){
     return T();
    }
};
 
int main()
{
    Widget1 wd;
    Widget w1 = wd;
}
По этой причине, кстати, не рекомендуется использовать приведение через такой оператор без крайней необходимости.
Посмотрите, например, старые книги С. Мейерса: "35 и 55 советов". Там это подробно описывается.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 16:26  [ТС]
DrOffset, а как правильно вызывать этот оператор , с помощью "=" или "()"? Насколько я понимаю то первый вариант будет правильнее т.к. в первом варианте не ругается на конструктор значит вызывается оператор ,но если я попытаюсь использовать прямую инициализацию то вызовется конструктор вместо оператора ,но если этого конструктора нет при прямой инициализации вызывается оператор
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2019, 16:30
Цитата Сообщение от ReYalp Посмотреть сообщение
а как правильно вызывать этот оператор , с помощью "=" или "()"?
Слово "правильно" тут не применимо.
Абстрактно правильно и так и так. Но смысл будет разный.
Если оставить круглые скобки, то неоднозначность сохранится, т.к. вы явно запрашиваете инициализацию объекта при наличии двух равнозначных вариантов преобразования. С знаком = у вас вариант преобразования через int недоступен, потому что помечен explicit.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
18.12.2019, 16:33  [ТС]
DrOffset, если взять вот такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 struct Widget1{
    Widget1(){std::cout<<"ctor1\n";}
     //template<class T>
     //operator T(){
     //    std::cout<<"operator\n";
    // return T();
    //}
};
 
struct Widget {
    Widget(){}
    Widget(int) {std::cout<<"int ctor\n";}
    Widget(const Widget& wg){std::cout<<"copy1\n";}
    Widget(const Widget1& wg){std::cout<<"copy2\n";}
};
 
int main()
{
    Widget1 wd;
    Widget w1 = wd;
}
получается что в "=" приоритетнее оператор , тогда как у "()" конструктор, если одного из них нет то вызывается другой, я понимаю что так делать не стоит но все же странно что оператор может вызываться и с "()" и с "="
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
19.12.2019, 18:54
Тема себя исчерпала, в новых сообщениях ничего полезного нет, потому я ее закрываю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2019, 18:54

Rvalue и lvalue ссылки
Здравствуйте, что расскажите, пожалуйста что такое lvalue и rvalue ссылки и с чем их едят, где можно использовать, и чем отличается...

STL и rvalue ссылки
Привет. Помню как-то читал инфу о том, что в стандартных контейнерах rvalue работают, как lvalue. Те имеется ввиду, что имеется два...

RVALUE ссылки и операции с ними
Господа знатоки у меня вопрос следующий. Увидел недавно такую запись &quot;T&amp;&amp; a&quot;, узнал что это rvalue ссылки, вроде как разобрался что это и...

Запретить initializer-list конструктору принимать rvalue значения/ссылки
Здравствуйте! Опишу проблему из заголовка поста на примере... Допустим есть шаблонный класс с initializer-list конструктором: ...

Ссылка на rvalue, является ли она сама rvalue?
А верно ли, что ссылка на rvalue сама не является rvalue? Вот такой код является валидным: #include &lt;iostream&gt; int main() { ...


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

Или воспользуйтесь поиском по форуму:
94
Закрытая тема Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru