Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Работа с группами элементов в массиве В массиве вещественных чисел найти предпоследнюю группу, которая состоит только из отрицательных элементов. #include <iostream> using namespace std; int main() { int i,j,n,ip,i1,k; float a; cout<<"Razmer massiva="; cin>>n; https://www.cyberforum.ru/ cpp-beginners/ thread2251674.html C++ Передача структуры в функцию
Написал код самой программы,все работает,а вот как сделать так,чтобы стуктуру передать в функцию не понимаю. #include "stdafx.h" #include <iostream> #include <string> using namespace std; struct UchenikInfo { string name;
C++ Странное значение переменной bool Здравствуйте. Разминаю мозг - пишу простенькую игрушку. По задумке, солдаты перемещаются по клеткам поля и могут атаковать солдат противоположной стороны, если оказались на соседних клетках. Решил объединить солдат в отряды, и поломать голову над поддержанием формации и поиском пути для отряда. Для возможности обращаться к солдату и через отряд, в котором он состоит, и через ячейку, где он... https://www.cyberforum.ru/ cpp-beginners/ thread2251644.html C++ Увеличить длину указателя, не стирая уже записанные туда значения https://www.cyberforum.ru/ cpp-beginners/ thread2251633.html
Кто знает, как это сделать? Например, если в указателе записано 1, 2, 3, 4, 5, то сделать 1, 2, 3, 4, 5, 0, 0, 0, желательно без присвоения в цикле.
Файлы: заменить последовательность P1 подряд идущих символов последовательностью P2 C++
Пусть дан текстовый файл. Заменить последовательность P1 подряд идущих символов последовательностью P2. Последовательность P1 и P2 задаются пользователем.
C++ правильно ли я перевел код из паскаля в c++? https://www.cyberforum.ru/ cpp-beginners/ thread2251605.html
Вот кода на c++ #include "stdafx.h" #include <iostream> using namespace std; int main() { const int s = 8; int amax = 1001; int N;
C++ Вычисление комплексных корней методом Ньютона-Рафсона Как данное уравнение (x3 – 3x2 + 4x – 12 = 0) и условие (n=3, а вектор коэффициентов уравнения q=(-12, 4, -3, 1)) вставить в программу: #include <stdio.h> #include <math.h> #include <conio.h> int Newton_Rafson(int n, float q, float p); int main(int argc, char **argv) { https://www.cyberforum.ru/ cpp-beginners/ thread2251574.html Как рационально выяснить сколько времени работала программа C++
Как посчитать сколько времени работает программа? Точнее сама сортировка. Так как если вставить таймер в начале main, он считает и то время, пока происходит выбор сортировки по убыванию/возрастанию. #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; void rus_did(int *mas, int *rmas, int *q); void rus_maz(int *mas, int *rmas, int *q); void paslenkame(int *ind,...
C++ While и For Помогите разобраться с заданием. Нужно реализовать данную задачу через for и While ( Т.е 2 раза ее написать). Вообще не понимаю как это сделать и не понимаю условия задачи. Помогите пожалуйста Задано количество цифр в номере билета. определить количество "счастливых" билетов https://www.cyberforum.ru/ cpp-beginners/ thread2251566.html C++ Сделать разделение и поиск слов в строке через запятую https://www.cyberforum.ru/ cpp-beginners/ thread2251565.html
Ниже прикладываю код программы. По ней необходимо найти самое короткое слово. Проблема в том, что программа находит, ввод вводится через запятую по заданию, а в результате (Res) отображается слово, но и запятая вместе с тем. Как сделать без этой запятой в результате, но при обязательном вводе через запятую? #include "stdafx.h" #include <iostream> #include <sstream> #include <string> using...
Передача аргументов в функцию C++
Прошу помощи в разборе багов кода. Ошибка при компиляции связана с неверной передачей аргументов в функцию. Но я никак не пойму , в чём проблема. Код::: #include <iostream> #include <cstring> using namespace std; int cicle( int i, int j, int i_const, int j_const , int m ,int n , int max , int szetzik_i , char *str1 , char *str2 )
C++ Error: only static const integral data members can be initialized within a class https://www.cyberforum.ru/ cpp-beginners/ thread2251503.html
Здравствуйте, помогите исправить ошибку 1. error C2864: 'Station::stdOut' : only static const integral data members can be initialized within a class #pragma once #include <string> struct Station { public:
 Аватар для eva2326
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
21.05.2019, 20:34 0

Возвращаемый тип как rvalue reference - C++ - Ответ 13589322

21.05.2019, 20:34. Показов 5445. Ответов 20
Метки (Все метки)

Ответ

Цитата Сообщение от Undisputed Посмотреть сообщение
Проверял на трех компиляторах, с правой ссылкой или без нее - результат одинаковый...
Как же вы так умыдрились получить одинаковый результат?

https://rextester.com/QFNOQ77094


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <vector>
 
 
struct Value
{
    Value() noexcept { std::cout << "ctor\n"; }
   ~Value()          { std::cout << "dtor\n"; }
    
    Value(const Value&) noexcept { std::cout << "copy\n"; }
    Value(Value&&)      noexcept { std::cout << "move\n"; }
};
 
class Widget
{
    
public:
    using DataType = std::vector<Value>;
    
    ~Widget() 
    {
        std::cout << "Widget: dctor\n";
    }
    
    Widget() : m_values()
    {
        std::cout << "Widget: ctor\n";
        m_values.emplace_back();
    }
    DataType& data() &
    {
        return m_values;
    }
    DataType&& data() &&
    { 
        std::cout << "[1] return DataType&&\n";
        return std::move(m_values); 
    }
   
    DataType values() &&
    { 
        std::cout << "[2] return DataType\n";
        //return std::move(m_values); 
        return m_values; 
    }
    
    DataType values2() &&
    { 
        std::cout << "[2] return move(m_values)\n";
        return std::move(m_values); 
    }
    
    
    
 
    DataType m_values;
};
 
int main()
{
    using DataType = Widget::DataType;
    {
        std::cout << "\nexperiment #1...\n";    
        DataType&& values = Widget().data();
        std::cout << "done!\n";
        (void) values;
    }
    
    {
        std::cout << "\nexperiment #2...\n";    
        DataType&& values = Widget().values();
        std::cout << "done!\n";
        (void) values;
    }
    
    {
        std::cout << "\nexperiment #3...\n";    
        DataType&& values = Widget().values2();
        std::cout << "done!\n";
        (void) values;
    }
    
    {
        std::cout << "\nexperiment #4...\n";    
        DataType&& values = Widget().m_values;
        std::cout << "done!\n";
        (void) values;
    }
    
}
Код
experiment #1...
Widget: ctor
ctor
[1] return DataType&&
Widget: dctor
dtor
done!

experiment #2...
Widget: ctor
ctor
[2] return DataType
copy
Widget: dctor
dtor
done!
dtor

experiment #3...
Widget: ctor
ctor
[2] return move(m_values)
Widget: dctor
done!
dtor

experiment #4...
Widget: ctor
ctor
done!
Widget: dctor
dtor

Наглядно видно, что:
1.
В первом случае получаем невалидную ссылку.
Попытка использовать такую ссылку - ub

2.
Во втором случае выполняется копия объекта.
Не эффективно.

3.
Мембер был перемещен во временный объект.
время жизни временного объекта - до конца работы с итоговой ссылкой.

4.
Итоговая ссылка продлила время жизни всего класса Widget
С одной стороны это наиболее эффективный способ.

С другой - компиляторы до сих пор не осилили эту часть стандарта.
Можно запросто нарваться на протухшую ссылку.

Итого: 3й вариант самый лучший: надежный и эффективный.

(c) hoggy

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

известный факт:
константная ссылка на временный объект подливает время его жизни
до конца жизни самой ссылки.

https://ideone.com/mKHcSL
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
struct data
{
    ~data() { std::cout << "data: destructor\n"; }
};
 
int main() 
{
    std::cout << "begin...\n";
    {
        const auto& ref = data{};
        std::cout << "work with temporary...\n";
    }
    std::cout << "finished!\n";
}
но что будет, если мы возьмем константную ссылочку не на весь агрегат,
а только на какой то один из мемберов?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
struct data
{
    ~data() { std::cout << "data: destructor\n"; }
};
 
struct sample
{
    data value;
    
    ~sample()   { std::cout << "sample: destructor\n"; }
};
 
int main() 
{
    std::cout << "begin...\n";
    {
        const auto& ref = sample().value;
        std::cout << "work with temporary...\n";
    }
    std::cout << "finished!\n";
}
вывод в консоль:
Код
begin...
work with temporary...
sample: destructor
data: destructor
finished!
продлевается жизнь всего агрегата.
отлично! - скажешь ты, - это логично.
раз время жизни мембера продлевается,
тогда нужно продлить время жизни и всего агрегата,
ведь без хозяина мембер существовать не может.

теперь оставляем в классе хозяине только POD-типы мемберов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
struct data
{
    ~data() { std::cout << "data: destructor\n"; }
};
 
struct sample
{
    //data value;
    int value;
    
    ~sample()   { std::cout << "sample: destructor\n"; }
};
 
int main() 
{
    std::cout << "begin...\n";
    {
        const auto& ref = sample().value;
        std::cout << "work with temporary...\n";
    }
    std::cout << "finished!\n";
}
вывод в консоль:
Код
begin...
sample: destructor
work with temporary...
finished!
и о боже! деструктор агрегата отработал раньше,
чем закончилось время жизни константной ссылки!
в этом случае мы получаем протухшую ссылку.
привет багам!

что примечательно:
на разных компиляторах с разными настройками оптимизации
можно получить разные результаты.

вывод:
ну его нафиг: связываться с "временными мемберами".

практика показывает:
не нужно здесь искать какую то логику,
и на что либо закладываться.
(c) hoggy
сообщение скопировано с другого форума.


Вернуться к обсуждению:
Возвращаемый тип как rvalue reference C++
0
Заказать работу у эксперта
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2019, 20:34
Готовые ответы и решения:

C++ expressions - rvalue, glvalue, prvalue, xvalue, lvalue, а также rvalue reference: что есть что?
Доброго времени суток, не понимаю до конца деление С++ - выражений (приложение 1). Lvalue вроде...

RVALUE Ссылка, error: cannot bind non-const lvalue reference of type 'String&' to an rvalue of type 'String'|
Код не компилируется ниже 17 стандарта с++ с ошибкой error: cannot bind non-const lvalue reference...

Rvalue reference
#include &lt;iostream&gt; std::string get_string() { return std::string(&quot;12345&quot;); } int main()...

Rvalue reference
Добрый вечер! Помогите пожалуйста разобраться с rvalue reference: template &lt;class T&gt; void...

20
21.05.2019, 20:34
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.05.2019, 20:34
Помогаю со студенческими работами здесь

Rvalue reference and lambda
void foo(A&amp;&amp; a) { auto l = () {}; //a? } Как передать в лямбду rvalue ref как просто...

std::move, rvalue reference
Здравствуйте! Недавно начал разбираться с новыми способами передачи аргументов. Прочитал около 10...

Rvalue reference. Что происходит в коде?
В консоли пусто. Но &quot;worked&quot; выводит. Почему? #include &lt;iostream&gt; using std::cout; class...

что за возвращаемый тип, и как работает функция?
pair&lt;string, string&gt; splitExpression(string expr) { stringstream ss; ss &lt;&lt; expr; pair&lt;string,...

0
Новые блоги и статьи
Как вставить элемент в массив на указанный индекс в JavaScript
hw_wired 24.01.2025
Массивы являются одной из фундаментальных структур данных в JavaScript, предоставляющей разработчикам мощный инструмент для хранения и управления упорядоченными наборами данных. Они позволяют хранить. . .
Чем отличаются HashMap и Hashtable в Java
hw_wired 24.01.2025
В мире разработки на Java существует множество инструментов для работы с коллекциями данных, и среди них особое место занимают структуры данных для хранения пар ключ-значение. HashMap и Hashtable. . .
Как конвертировать видео в GIF
hw_wired 24.01.2025
В современном мире анимированные изображения стали неотъемлемой частью цифровой коммуникации. Формат GIF (Graphics Interchange Format) представляет собой особый тип файлов, который позволяет. . .
Как скопировать текст в буфер обмена на JavaScript во всех браузерах
hw_wired 24.01.2025
Копирование текста в буфер обмена стало неотъемлемой частью современных веб-приложений, значительно улучшающей пользовательский опыт и упрощающей работу с контентом. В эпоху активного обмена. . .
Как скрыть клавиатуру на Android
hw_wired 24.01.2025
При разработке Android-приложений часто возникает необходимость управлять видимостью экранной клавиатуры для улучшения пользовательского опыта. Одним из наиболее эффективных способов контроля. . .
Как обучить нейросеть создания картинок на Python
bytestream 24.01.2025
В эпоху цифровых технологий искусственный интеллект становится неотъемлемой частью творческого процесса. Особое место в этой области занимает разработка и обучение нейронных сетей для создания. . .
Как обучить нейросеть генерации текста на Python
bytestream 24.01.2025
В современном мире искусственный интеллект и машинное обучение становятся неотъемлемой частью многих технологических решений. Одной из наиболее интересных и востребованных задач в этой области. . .
Машинное обучение на Python
bytestream 24.01.2025
Введение в машинное обучение на Python Машинное обучение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, которая позволяет компьютерным системам. . .
Как удалить вирус-майнер с компьютера
hw_wired 24.01.2025
Вирусы-майнеры стали одной из наиболее серьезных угроз для пользователей компьютеров. Эти вредоносные программы тайно используют вычислительные ресурсы зараженного устройства для добычи криптовалюты. . .
Что такое веб-сервер, для чего он нужен и как работает
bytestream 24.01.2025
В современную эпоху цифровых технологий веб-сервер является фундаментальным компонентом интернет-инфраструктуры, обеспечивающим функционирование множества онлайн-сервисов и веб-сайтов. Этот. . .
Как в цикле for перебрать все элементы в словаре в Python
bytestream 24.01.2025
Словари в Python представляют собой мощные структуры данных, которые позволяют хранить информацию в формате ключ-значение. Эта особенность делает их незаменимыми при работе с данными, где требуется. . .
Как отменить rebase в Git
hw_wired 24.01.2025
Git rebase представляет собой мощный инструмент для управления историей коммитов в системе контроля версий Git. Этот механизм позволяет разработчикам изменять последовательность, комбинировать или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru