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

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

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

Rvalue vector - C++

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

Как это?
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
Посмотрите здесь:

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main - C++
//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;...

rvalue - C++
добрый вечер. интересно ваше мнение. значит ли появление rvalue reference в новом стандарте то, что теперь локальным объектам зеленый свет....

Как корректно скопировать vector в vector внутри класса - C++
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt; codeList); ~test(); ...

Непостижимый rvalue - C++
Код// тестирование с чтением из потоков void stream_io_test( std::istream&amp; in, std::ostream&amp; out ); // тестируем, вводя числа из...

Rvalue reference - C++
#include &lt;iostream&gt; std::string get_string() { return std::string(&quot;12345&quot;); } int main() { std::string const&amp; str =...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ASCII
90 / 62 / 10
Регистрация: 15.12.2013
Сообщений: 399
Завершенные тесты: 2
30.05.2016, 15:57     Rvalue vector #21
Цитата Сообщение от daslex Посмотреть сообщение
Получится xvalue, так я пробовал.
Ссылка-то все равно висячая
notAll
390 / 111 / 23
Регистрация: 27.05.2016
Сообщений: 286
Завершенные тесты: 2
30.05.2016, 15:57     Rvalue vector #22
Цитата Сообщение от daslex Посмотреть сообщение
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
Вообще то автор ее там вводит для того чтобы функция могла принимать rvalue и lvalue, а не для решения проблем висячих ссылок.
ASCII
90 / 62 / 10
Регистрация: 15.12.2013
Сообщений: 399
Завершенные тесты: 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
390 / 111 / 23
Регистрация: 27.05.2016
Сообщений: 286
Завершенные тесты: 2
30.05.2016, 16:00     Rvalue vector #24
Цитата Сообщение от daslex Посмотреть сообщение
int &ref = foo(vector<int>{1,2,3},2); //Ссылаюсь на элемент временного объекта, проблем нет. Должны же быть.
Как нет проблем, у меня мусор выводит.
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
30.05.2016, 16:17  [ТС]     Rvalue vector #26
Цитата Сообщение от avgoor Посмотреть сообщение
Проблема скорее всего "потом решается" не обобщенной ссылкой, а именно разными реализациями.
Я уже написал, что могу путать.

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

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

clang, gcc, visual studio.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
30.05.2016, 16:25  [ТС]     Rvalue vector #27
Цитата Сообщение от avgoor Посмотреть сообщение
универсальная ссылка ее решить не поможет
Вот рисунок текста. Переписывать долго.
Миниатюры
Rvalue vector  
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
30.05.2016, 16:36     Rvalue vector #28
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3.
UB же.
Корректно работающая программа -- частный случай неопределенного поведения. Это надо запомнить на всю жизнь
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
30.05.2016, 16:36     Rvalue vector #29
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3
У меня в VS2015 в релизе - 3, в дебаге - мусор.

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

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

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

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

Почему *(a+j) не rvalue? - C++
Запись массива вида a - это lvalue и эквивалентна *(a+j), но почему *(a+j) не rvalue, потому что сумма a+j должна была бы быть rvalue, но...

Записать vector<vector<wchar_t>> в текстовый файл - C++
Подскажите пожалуйста, как записать vector&lt;vector&lt;wchar_t&gt;&gt; в файл. Файл необходимо открывать через _wfopen. Пробую так, не получается....

При include<vector> не включает и не видит vector - C++
Не видит vector: //--ClassNeuron.h #ifndef NEURON_H #define NEURON_H #include &lt;cstdlib&gt; #include...

Struct / Vector / Expression: vector subscript out of range - C++
Добрый вечер. Имеется структура: struct Contact { public: string name; vector&lt;string&gt; phoneNumber; };


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

Или воспользуйтесь поиском по форуму:
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
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