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

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

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

Rvalue vector - C++

30.05.2016, 12:41. Просмотров 549. Ответов 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.Так вот о...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,661
30.05.2016, 12:45     Rvalue vector #2
daslex, я могу дико ошибаться, но по определению STL контейнеры хранят копию и следовательно, она копирует ваши нули и они вовсе не rvalue.

а 2 строка будет валидной, если первая скомпилируется и второя будет содержать std::move

P.S. Сложные у вас вечно вопрос) Где вопросики про что такое переменная - на такие я бы мог ответить, а тут снова ждать сторожил.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
30.05.2016, 13:31  [ТС]     Rvalue vector #3
Я задам вопрос немного по-другому. Как вот в эту функцию
C++
1
2
3
4
5
6
template <typename T, typename T2>
decltype(auto) foo(T& container, T2 index)
{
 
    return container[index]; 
}
Подать временный контейнер таким образом, чтобы он в неё не передался? В смысле, что он не должен туда передаваться. rvalue невозможно связать с lvalue (если только они не являются lvalue на константные объекты).

Мне нужен такой rvalue, который не lvalue.

Добавлено через 35 минут
Вот так можно.
C++
1
foo(vector<int>{1,1,1,1,1,1,1,1,1,1}, 4) ; //rvalue отдаётся
Но мне ещё надо увидеть эффект висячей ссылки, что у этого временного вектора элемент прекращает своё существование после вызова функции.

Как связаться с такой ссылкой на элемент такого контейнера, не понимаю.
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
30.05.2016, 13:39     Rvalue vector #4
Цитата Сообщение от daslex Посмотреть сообщение
Подать временный контейнер таким образом, чтобы он в неё не передался? В смысле, что он не должен туда передаваться.
В смысле, чтобы при передаче временного контейнера была ошибка компиляции?
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
30.05.2016, 13:48  [ТС]     Rvalue vector #5
Цитата Сообщение от avgoor Посмотреть сообщение
В смысле, чтобы при передаче временного контейнера была ошибка компиляции?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename T, typename T2>
decltype(auto) foo(T& container, T2 index)
{
 
    return container[index]; 
}
 
int main(){
   foo(vector<int>{1,1,1,1,1,1,1,1,1,1}, 4) = 25 ; //rvalue отдаётся, не компилируюсь. так и надо, 
                                                               //меняю на rvalue параметры функции,
                                                               //компилируется. ОК
   /*
Здесь нужно обратиться к элементу временного вектора и словить
   эффект висячей ссылки
*/
}
notAll
390 / 111 / 23
Регистрация: 27.05.2016
Сообщений: 287
Завершенные тесты: 2
30.05.2016, 13:51     Rvalue vector #6
C++
1
2
3
4
5
6
template <typename T, typename T2>
decltype(auto) foo(T&& container, T2 index)
{
    static_assert(std::is_lvalue_reference<T>::value, "T must be not rvalue");
    return container[index];
}
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
30.05.2016, 14:27     Rvalue vector #7
daslex, Че то нифига не понял. Вот висячая ссылка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class MyContainer
{
    int data;
public:
    MyContainer() : data(0)
    {
        std::cout << "MyContainer() " << &data << std::endl;
    }
    MyContainer(MyContainer& r) : data(r.data)
    {
        std::cout << "MyContainer(MyContainer&)" << std::endl;
    }
    MyContainer(MyContainer&& r) : data(r.data)
    {
        std::cout << "MyContainer(MyContainer&&)" << std::endl;
    }
    ~MyContainer()
    {
        std::cout << "~MyContainer()" << std::endl;
    }
 
    int& getData() { return data; }
};
 
template<class T>
decltype(auto) foo(T& cont)
{
    std::cout << "In foo() " << &cont.getData() << std::endl;
    return cont.getData();
}
 
int main()
{
    int& ref = foo(MyContainer());
    std::cout << "Will modify " << &ref << std::endl;
    ref = 42;
}
Добавлено через 19 минут
Чуть изменил, чтоб совсем похоже было:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class MyContainer : public std::vector<int>
{
public:
    MyContainer() : std::vector<int>(1, 1)
    {
        std::cout << "MyContainer() " << &(*this)[0] << std::endl;
    }
    MyContainer(const MyContainer& r) : std::vector<int>(r)
    {
        std::cout << "MyContainer(MyContainer&)" << std::endl;
    }
    MyContainer(MyContainer&& r) : std::vector<int>(r)
    {
        std::cout << "MyContainer(MyContainer&&)" << std::endl;
    }
    ~MyContainer()
    {
        std::cout << "~MyContainer()" << std::endl;
    }
};
 
template<class T>
decltype(auto) foo(T& cont)
{
    std::cout << "In foo() " << &cont[0] << " " << cont[0] << std::endl;
    return cont[0];
}
 
int main()
{
    int& ref = foo(MyContainer());
    std::cout << "Will modify " << &ref << " " << ref << std::endl;
    ref = 42;
    std::cout << "Now " << &ref << " " << ref << std::endl;
}
Вывод:
MyContainer() 00A72988
In foo() 00A72988 1
~MyContainer()
Will modify 00A72988 -572662307
Now 00A72988 42
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
30.05.2016, 14:53  [ТС]     Rvalue vector #8
Эффективный и современный С++.
1.3 Знакомство с decltype.

Только название функции у меня foo. Я не могу понять как поймать висячую ссылку. Что такое висячие ссылки я знаю. Я хочу её словить в конкретном примере.
Миниатюры
Rvalue vector  
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
30.05.2016, 15:03     Rvalue vector #9
daslex, Так у меня ж в выводе Все адреса совпадают, т.е. - это один объект.
В третьей строке - вывод из деструктора, т.е. объект уничтожен.
В четвертой строке видно мусор (UB, в данном случае проявилось так)
В пятой строке видно измененоое значение висячей ссылки (42). Теперь надо ловить перезапись этой памяти. Это легче сделать из первого моего примера (там висячая ссылка указывает на стек, т.е. просто вызвать несколько новых функций и убедиться что данные затрутся)
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
30.05.2016, 15:07  [ТС]     Rvalue vector #10
Пример тяжело читается...
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
30.05.2016, 15:09     Rvalue vector #11
Цитата Сообщение от daslex Посмотреть сообщение
Пример тяжело читается...
Как смог
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
30.05.2016, 15:24  [ТС]     Rvalue vector #12
Время немного нужно. Просто отклонилось от простого минималистичного немного.

Добавлено через 9 минут
Ваш пример и не компилируется в clang.

Добавлено через 42 секунды
А мне нужно понять, о чём толкует автор книги.

Добавлено через 1 минуту
я вижу xvalue, но не вижу висячести. ( в своём варианте кода)
ASCII
90 / 62 / 10
Регистрация: 15.12.2013
Сообщений: 399
Завершенные тесты: 2
30.05.2016, 15:33     Rvalue vector #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
daslex, я могу дико ошибаться, но по определению STL контейнеры хранят копию и следовательно, она копирует ваши нули и они вовсе не rvalue.
а 2 строка будет валидной, если первая скомпилируется и второя будет содержать std::move
P.S. Сложные у вас вечно вопрос) Где вопросики про что такое переменная - на такие я бы мог ответить, а тут снова ждать сторожил.
Действительно ошибаетесь. Первая строка не компилируется не потому, что нули не rvalue (они то как раз rvalue, а точней prvalue, которые являются rvalue), а потому что в терминологии стандарта ссылка - не объект, а посему нельзя хранить массив ссылок например, нельзя создать указатель на ссылку (но ссылку на указатель можно). Но если бы можно было создать такой вектор, как в первой строке, то вторая все равно-бы не скомпилировалась, ибо тип объекта на который ссылается ссылка и тип ссылки - разные

Добавлено через 8 минут
Цитата Сообщение от daslex Посмотреть сообщение
Я не могу понять как поймать висячую ссылку. Что такое висячие ссылки я знаю. Я хочу её словить в конкретном примере.
Тоже самое что и висячий указатель, только ссылка:
C++
1
2
3
4
5
int& get_dangling_ref()
{
    int a = 10;
    return a;
}
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
30.05.2016, 15:34     Rvalue vector #14
Цитата Сообщение от daslex Посмотреть сообщение
Ваш пример и не компилируется в clang.
Замените decltype(auto) foo(T& cont) на decltype(auto) foo(T&& cont)
http://rextester.com/live/ULEC6490
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2016, 15:36     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; };


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

Или воспользуйтесь поиском по форуму:
notAll
390 / 111 / 23
Регистрация: 27.05.2016
Сообщений: 287
Завершенные тесты: 2
30.05.2016, 15:36     Rvalue vector #15
Цитата Сообщение от daslex Посмотреть сообщение
Я не могу понять как поймать висячую ссылку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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};
    foo(v, 0) = 42;
    std::cout << v.front();
    auto& good_ref = foo(v, 1);
    good_ref = 84;
    std::cout << v[1];
 
    auto& bad_ref = foo(std::vector<int>{1,2,3,4}, 0);
    bad_ref = 42;
}
Yandex
Объявления
30.05.2016, 15:36     Rvalue vector
Ответ Создать тему
Опции темы

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