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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
daslex
1270 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,650
#1

Rvalue vector - C++

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

Как это?
C++
1
2
vector<int&&> v = {0,0,0};// Это не скомпилируется (Вектор, якобы, хранит rvalue)
vector<int> &&rval_vec = v; //Это не скомпилируется (Вектор, якобы, rvalue)
Встретил такое определение, как rvalue контейнер, и не понял, что это такое.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ASCII
90 / 62 / 10
Регистрация: 15.12.2013
Сообщений: 392
Завершенные тесты: 2
30.05.2016, 15:57     Rvalue vector #21
Цитата Сообщение от daslex Посмотреть сообщение
Получится xvalue, так я пробовал.
Ссылка-то все равно висячая
notAll
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
30.05.2016, 15:57     Rvalue vector #22
Цитата Сообщение от daslex Посмотреть сообщение
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
Вообще то автор ее там вводит для того чтобы функция могла принимать rvalue и lvalue, а не для решения проблем висячих ссылок.
ASCII
90 / 62 / 10
Регистрация: 15.12.2013
Сообщений: 392
Завершенные тесты: 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
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
30.05.2016, 16:00     Rvalue vector #24
Цитата Сообщение от daslex Посмотреть сообщение
int &ref = foo(vector<int>{1,2,3},2); //Ссылаюсь на элемент временного объекта, проблем нет. Должны же быть.
Как нет проблем, у меня мусор выводит.
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,461
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
1270 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,650
30.05.2016, 16:17  [ТС]     Rvalue vector #26
Цитата Сообщение от avgoor Посмотреть сообщение
Проблема скорее всего "потом решается" не обобщенной ссылкой, а именно разными реализациями.
Я уже написал, что могу путать.

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

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

clang, gcc, visual studio.
daslex
1270 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,650
30.05.2016, 16:25  [ТС]     Rvalue vector #27
Цитата Сообщение от avgoor Посмотреть сообщение
универсальная ссылка ее решить не поможет
Вот рисунок текста. Переписывать долго.
Миниатюры
Rvalue vector  
DrOffset
6856 / 4067 / 927
Регистрация: 30.01.2014
Сообщений: 6,863
30.05.2016, 16:36     Rvalue vector #28
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3.
UB же.
Корректно работающая программа -- частный случай неопределенного поведения. Это надо запомнить на всю жизнь
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,461
30.05.2016, 16:36     Rvalue vector #29
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3
У меня в VS2015 в релизе - 3, в дебаге - мусор.

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

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

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

Как-то так пишет.
daslex
1270 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,650
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
Еще ссылки по теме:

Как корректно скопировать vector в vector внутри класса C++
Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) C++
Function return rvalue C++
Rvalue ссылки C++
Ошибка [Linker error] undefined reference to `Vector::Vector(int)' C++

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

Или воспользуйтесь поиском по форуму:
avgoor
883 / 518 / 111
Регистрация: 05.12.2015
Сообщений: 1,461
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru