Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
#1

Rvalue vector - C++

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

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

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;...

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

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

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

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

Указатель на объект вектор в векторе vector < vector<int>* >* - C++
Дело касается вот чего, есть такая вот незатейлевая вещь. #include &lt;vector&gt; #include &lt;iostream&gt; int main( ) { using...

31
ASCII
90 / 63 / 10
Регистрация: 15.12.2013
Сообщений: 407
Завершенные тесты: 2
30.05.2016, 15:40 #16
Цитата Сообщение от avgoor Посмотреть сообщение
Замените decltype(auto) foo(T& cont) на decltype(auto) foo(T&& cont)
http://rextester.com/live/ULEC6490
либо на decltype(auto) foo(T const& cont)
Только return-type будет c const
1
avgoor
30.05.2016, 15:44
  #17

Не по теме:

Цитата Сообщение от ASCII Посмотреть сообщение
либо на decltype(auto) foo(T const& cont)
В данном случае, все-таки, правильнее использовать "генерализованную ссылку":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
void foo(T&& t)
{
    std::cout << std::is_rvalue_reference<decltype(t)>::value << std::endl;
}
 
class A {};
 
int main()
{
    foo(A());
    A a;
    foo(a);
}
Вывод:
1
0

0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
30.05.2016, 15:49  [ТС] #18
Цитата Сообщение от ASCII Посмотреть сообщение
Замените decltype(auto) foo(T& cont) на decltype(auto) foo(T&& cont)
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.

Это как сбежать не разобравшись.

Цитата Сообщение от ASCII Посмотреть сообщение
decltype(auto) foo(T const& cont)
Получится xvalue, так я пробовал.

notAll,
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
0
ASCII
90 / 63 / 10
Регистрация: 15.12.2013
Сообщений: 407
Завершенные тесты: 2
30.05.2016, 15:51 #19
avgoor, Да, только будьте готовы на таком примере объяснить человеку, что такое Collapsing rule
1
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
30.05.2016, 15:56  [ТС] #20
Важно: Я не понимаю о чём пишет автор. Поэтому нечаянно могу и других путать.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
using namespace std;
 
template <typename T, typename T2>
decltype(auto) foo(T&& container, T2 index)
{
    return container[index];
}
 
int main()
{
    std::vector<int> v{1,2,3,4};
 
    int &ref = foo(vector<int>{1,2,3},2); //Ссылаюсь на элемент временного объекта, проблем нет. Должны же быть.
    cout << ref << '\n';
}
Добавлено через 43 секунды
Должна же быть проблема, коли о ней написано.
0
ASCII
90 / 63 / 10
Регистрация: 15.12.2013
Сообщений: 407
Завершенные тесты: 2
30.05.2016, 15:57 #21
Цитата Сообщение от daslex Посмотреть сообщение
Получится xvalue, так я пробовал.
Ссылка-то все равно висячая
1
notAll
425 / 146 / 36
Регистрация: 27.05.2016
Сообщений: 393
Завершенные тесты: 2
30.05.2016, 15:57 #22
Цитата Сообщение от daslex Посмотреть сообщение
Не пойдёт. Это получается универсальная ссылка. Которой проблема потом решается.
Вообще то автор ее там вводит для того чтобы функция могла принимать rvalue и lvalue, а не для решения проблем висячих ссылок.
1
ASCII
90 / 63 / 10
Регистрация: 15.12.2013
Сообщений: 407
Завершенные тесты: 2
30.05.2016, 15:59 #23
Цитата Сообщение от daslex Посмотреть сообщение
Должна же быть проблема, коли о ней написано.
Да тут та же самая проблема что и в моем примере выше:

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

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

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

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

clang, gcc, visual studio.
0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
30.05.2016, 16:25  [ТС] #27
Цитата Сообщение от avgoor Посмотреть сообщение
универсальная ссылка ее решить не поможет
Вот рисунок текста. Переписывать долго.
0
Миниатюры
Rvalue vector  
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
30.05.2016, 16:36 #28
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3.
UB же.
Корректно работающая программа -- частный случай неопределенного поведения. Это надо запомнить на всю жизнь
1
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
30.05.2016, 16:36 #29
Цитата Сообщение от daslex Посмотреть сообщение
В трёх компиляторах у меня вывело то, что я ждал: 3
У меня в VS2015 в релизе - 3, в дебаге - мусор.

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

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

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

Как-то так пишет.
0
30.05.2016, 16:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2016, 16:42
Привет! Вот еще темы с ответами:

Как корректно скопировать 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 ); // тестируем, вводя числа из...

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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