Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Rvalue vector

30.05.2016, 12:41. Показов 2424. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как это?
C++
1
2
vector<int&&> v = {0,0,0};// Это не скомпилируется (Вектор, якобы, хранит rvalue)
vector<int> &&rval_vec = v; //Это не скомпилируется (Вектор, якобы, rvalue)
Встретил такое определение, как rvalue контейнер, и не понял, что это такое.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2016, 12:41
Ответы с готовыми решениями:

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

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 of type 'String&amp;' to an rvalue of...

31
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
30.05.2016, 15:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daslex Посмотреть сообщение
Получится xvalue, так я пробовал.
Ссылка-то все равно висячая
1
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
30.05.2016, 15:57
Цитата Сообщение от daslex Посмотреть сообщение
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
Вообще то автор ее там вводит для того чтобы функция могла принимать rvalue и lvalue, а не для решения проблем висячих ссылок.
1
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
30.05.2016, 15:59
Цитата Сообщение от daslex Посмотреть сообщение
Должна же быть проблема, коли о ней написано.
Да тут та же самая проблема что и в моем примере выше:

C++
1
2
3
4
5
int& get_dangling_ref()
{
    int a = 10;
    return a;
}
И получив такую ссылку и выведя ее сразу после вызова функции, вы скорей всего и увидите 10, просто потому что на стеке еще не затерта эта переменная, но так делать нельзя, это UB
1
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
30.05.2016, 16:00
Цитата Сообщение от daslex Посмотреть сообщение
int &ref = foo(vector<int>{1,2,3},2); //Ссылаюсь на элемент временного объекта, проблем нет. Должны же быть.
Как нет проблем, у меня мусор выводит.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
30.05.2016, 16:04
Цитата Сообщение от daslex Посмотреть сообщение
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
Если проблема в висячей ссылке, универсальная ссылка ее решить не поможет, т.к. это просто способ написать одну фукцию вместо двух. Ссылка повиснет после выхода из функции, где параметры уже вне видимости, т.е. в не зависимости от того как выглядел параметр (например если не написать копирующий конструктор для класса, управляющего памятью - вы получите такую жу висячую ссылку при передаче по значению).

Проблема скорее всего "потом решается" не обобщенной ссылкой, а именно разными реализациями.
C++
1
2
3
4
template<class T>
foo(T&) {...}
template<class T>
foo(T&&) {...}
P.S. Майерс пишет, что вообще не надо возвращать внутренние дескрипторы объектов.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
30.05.2016, 16:17  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
Проблема скорее всего "потом решается" не обобщенной ссылкой, а именно разными реализациями.
Я уже написал, что могу путать.

Там не решается проблема. Это я напутал, а говорится о том, что это может иметь смысл. Вот.

Добавлено через 2 минуты
Цитата Сообщение от notAll Посмотреть сообщение
Как нет проблем, у меня мусор выводит.
В трёх компиляторах у меня вывело то, что я ждал: 3.

clang, gcc, visual studio.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
30.05.2016, 16:25  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
универсальная ссылка ее решить не поможет
Вот рисунок текста. Переписывать долго.
Миниатюры
Rvalue vector  
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
30.05.2016, 16:36
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3.
UB же.
Корректно работающая программа -- частный случай неопределенного поведения. Это надо запомнить на всю жизнь
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
30.05.2016, 16:36
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3
У меня в VS2015 в релизе - 3, в дебаге - мусор.

Цитата Сообщение от daslex Посмотреть сообщение
Вот рисунок текста.
Там написано ровно то же самое, что и я написал. Обратите внимание: "клиент может захотеть сделать копию элемента во временном контейнере". И еще, что-то про то, "когда это имеет смысл", а смысл это (т.е. обобщенная ссылка) имеет тогда, когда нам все равно - временный это объект или нет, т.е. мы не возвращаем ссылки на его данные.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
30.05.2016, 16:42  [ТС]
А зачем он так копирует?

Я не понимаю этого Мейерса. Он как-то пишет об одном и тут же это забывает словно.
1.3 Вот тут будут висячие ссылки, избежать этого можно, если... (тут явно недоговорено), UB.
Сразу же: "Придётся обновить реализацию шаблона в соответствии с предостережениями 5.3". Вот это поворот

Добавлено через 1 минуту
А что там с висячими ссылками - фиг с ними...

Как-то так пишет.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
30.05.2016, 16:51  [ТС]
Что в этом коде не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <utility>
 
using namespace std;
 
template <typename T, typename T2>
decltype(auto) foo(T&& container, T2 index)
{
    return forward<T>container[index];
}
 
int main()
{
    std::vector<int> v{1,2,3,4};
 
    int &ref = foo(vector<int>{1,2,3},2);
 
}
Миниатюры
Rvalue vector  
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
30.05.2016, 17:27
Цитата Сообщение от daslex Посмотреть сообщение
А зачем он так копирует?
Ну, например, есть функция, возвращающая вектор (например, координаты в n-мерноом пространстве) из которого нам интересно только одно значение (например вторая координата). Тогда:
C++
1
2
3
auto coord = //coord имеет не ссылочный тип int
getCoordinates()[1]; // () возвращает std::vector<int>, [] возвращает int&
//А деструктор std::vector вызовется в конце выражения, т.е. после '=', т.е. никакого UB
Добавлено через 4 минуты
auto s = ... конечно, запутывает, но надо запомнить (или, хотя бы, посмотреть наведя мышку) к какому типу оно принадлежит.

Добавлено через 28 минут
Цитата Сообщение от daslex Посмотреть сообщение
Я не понимаю этого Мейерса. Он как-то пишет об одном и тут же это забывает словно.
1.3 Вот тут будут висячие ссылки, избежать этого можно, если... (тут явно недоговорено), UB.
Сразу же: "Придётся обновить реализацию шаблона в соответствии с предостережениями 5.3". Вот это поворот
Добавлено через 1 минуту
А что там с висячими ссылками - фиг с ними...
Как-то так пишет.
Да, на мой взгляд Кнута и Сауструпа легче читать, но надо учитывать сам формат его (Майерса) книг (в котором сложно излагать материал последовательно).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2016, 17:27

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Цикл: Создайте класс Matrix на базе вектора vector<vector<int>>.
Создайте класс Matrix на базе вектора vector&lt;vector&lt;int&gt;&gt;. Определите операторную функцию ostream\&amp; operator&lt;&lt;(ostream\&amp;,...

Ошибка [Linker error] undefined reference to `Vector::Vector(int)'
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include &lt;iostream&gt; #include...

vector<Struct2{int,vector<struct1>}> или множественное наследование ...
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; int y; // координаты...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
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 и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru