Форум программистов, компьютерный форум CyberForum.ru

Rvalue vector - C++

Восстановить пароль Регистрация
 
 
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
30.05.2016, 12:41     Rvalue vector #1
Как это?
C++
1
2
vector<int&&> v = {0,0,0};// Это не скомпилируется (Вектор, якобы, хранит rvalue)
vector<int> &&rval_vec = v; //Это не скомпилируется (Вектор, якобы, rvalue)
Встретил такое определение, как rvalue контейнер, и не понял, что это такое.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2016, 12:41     Rvalue vector
Посмотрите здесь:

rvalue C++
Почему i++ это rvalue, а ++i lvalue? C++
C++ Почему *(a+j) не rvalue?
C++ std::move, rvalue reference
[C++11] move\rvalue ref semantic C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
30.05.2016, 15:57     Rvalue vector #21
Цитата Сообщение от daslex Посмотреть сообщение
Получится xvalue, так я пробовал.
Ссылка-то все равно висячая
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
notAll
176 / 65 / 16
Регистрация: 27.05.2016
Сообщений: 182
Завершенные тесты: 2
30.05.2016, 15:57     Rvalue vector #22
Цитата Сообщение от daslex Посмотреть сообщение
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
Вообще то автор ее там вводит для того чтобы функция могла принимать rvalue и lvalue, а не для решения проблем висячих ссылок.
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
30.05.2016, 15:59     Rvalue vector #23
Цитата Сообщение от daslex Посмотреть сообщение
Должна же быть проблема, коли о ней написано.
Да тут та же самая проблема что и в моем примере выше:

C++
1
2
3
4
5
int& get_dangling_ref()
{
    int a = 10;
    return a;
}
И получив такую ссылку и выведя ее сразу после вызова функции, вы скорей всего и увидите 10, просто потому что на стеке еще не затерта эта переменная, но так делать нельзя, это UB
notAll
176 / 65 / 16
Регистрация: 27.05.2016
Сообщений: 182
Завершенные тесты: 2
30.05.2016, 16:00     Rvalue vector #24
Цитата Сообщение от daslex Посмотреть сообщение
int &ref = foo(vector<int>{1,2,3},2); //Ссылаюсь на элемент временного объекта, проблем нет. Должны же быть.
Как нет проблем, у меня мусор выводит.
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
30.05.2016, 16:04     Rvalue vector #25
Цитата Сообщение от daslex Посмотреть сообщение
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
Если проблема в висячей ссылке, универсальная ссылка ее решить не поможет, т.к. это просто способ написать одну фукцию вместо двух. Ссылка повиснет после выхода из функции, где параметры уже вне видимости, т.е. в не зависимости от того как выглядел параметр (например если не написать копирующий конструктор для класса, управляющего памятью - вы получите такую жу висячую ссылку при передаче по значению).

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

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

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

clang, gcc, visual studio.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
30.05.2016, 16:25  [ТС]     Rvalue vector #27
Цитата Сообщение от avgoor Посмотреть сообщение
универсальная ссылка ее решить не поможет
Вот рисунок текста. Переписывать долго.
Миниатюры
Rvalue vector  
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
30.05.2016, 16:36     Rvalue vector #28
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3.
UB же.
Корректно работающая программа -- частный случай неопределенного поведения. Это надо запомнить на всю жизнь
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
30.05.2016, 16:36     Rvalue vector #29
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3
У меня в VS2015 в релизе - 3, в дебаге - мусор.

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

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

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

Как-то так пишет.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
30.05.2016, 16:51  [ТС]     Rvalue vector #31
Что в этом коде не так?
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  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2016, 17:27     Rvalue vector
Еще ссылки по теме:

Rvalue reference and lambda C++
Function return rvalue C++
Rvalue ссылки C++

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

Или воспользуйтесь поиском по форуму:
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
30.05.2016, 17:27     Rvalue vector #32
Цитата Сообщение от 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 минуту
А что там с висячими ссылками - фиг с ними...
Как-то так пишет.
Да, на мой взгляд Кнута и Сауструпа легче читать, но надо учитывать сам формат его (Майерса) книг (в котором сложно излагать материал последовательно).
Yandex
Объявления
30.05.2016, 17:27     Rvalue vector
Ответ Создать тему
Опции темы

Текущее время: 07:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru