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

std::move, rvalue reference - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ломбард - вывод табличных данных http://www.cyberforum.ru/cpp-beginners/thread850210.html
Помогите сделать таблицу. Плыз) #include <iostream> #include <fstream> #include <string.h> #include <windows.h> #include <iomanip> using namespace std; const int SZ=1;
C++ По поводу ссылок и конструктора копирования Никак не пойму. При создании объекта и передачи конструктору в качестве параметра объекта другого класса, отладчик показывает что на строчке Data(Element) выполняется конструктор копирования класса T. Разве не должна вместо этого теперь переменная Data "указывать" на туже область памяти что и ссылка Element. Я всегда думал что при присвоении объекту ссылки на другой объект никаких... http://www.cyberforum.ru/cpp-beginners/thread850196.html
Двухмерный массив: Написать программу, указывающую для каждого вопроса проценты ответов «Да», «Нет», «не знаю» C++
В двухмерном массиве размером n x m хранятся результаты опроса n человек на m вопросов. Ответами на вопросы являются слова «Да», «Нет», «не знаю». Написать программу, указывающую для каждого вопроса проценты ответов «Да», «Нет», «не знаю»
C++ Работа с графикой
Здравствуйте, помогите разобраться с программой? в результате должны получиться различные графические объекты, перемещающиеся по прямым траекториям с разными случайными векторами скоростей. и возможность добавления и удаления объектов. вот все, что есть. программа не работает. #include <stdlib.h> #include <time.h> #include <grx20.h> #include <grxkeys.h> struct TPoint{ int x,y; int vx,...
C++ Сформировать массив по правилу http://www.cyberforum.ru/cpp-beginners/thread850176.html
программа формирования и вывода массива размером 6 на 3, каждые три последовательных элемента в строке которого составлены по следующему правилу: 1-й - равен удвоенному числу, введенному с клавиатуры; 2-й - равен квадрату суммы индексов предыдущего элемента; 3-й - равен остатку от деления индекса текущего элемента на 2
C++ Нужна проверка кода (система обмена сообщениями) есть код C++,компилируется в Mingw/bin при помощи g++. Данный код представляет собой систему обмена сообщениями. Идеальный случай,когда юзер не допускает ошибок при вводе регистрационных данных. проблема в написании проверки ввода этих самых данных #include "iostream" #include "locale.h" #include <string> #include <stdio.h> #include <stdlib.h> using namespace std; подробнее

Показать сообщение отдельно
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.04.2013, 19:25  [ТС]     std::move, rvalue reference
Цитата Сообщение от Nick Alte Посмотреть сообщение
C++
1
2
3
4
5
6
class Foo
{
public:
    Foo( vector<string>&& v): vec( move(v) ) {}
    vector<string> vec;
};
В таком случае будет прямое перемещение? Не будет копирования?

Я не просто так передавал по значению. Я видел много раз, что люди так делают. Например такой класс:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Book {
public:
  Book(std::string title,
       std::vector<std::string> authors,
       size_t      pub_day
       std::string pub_month,
       size_t      pub_year)
    : _title    (std::move(title)),
      _authors  (std::move(authors)),
      _pub_day  (pub_day),
      _pub_month(std::move(pub_month)),
      _pub_year (pub_year)
     {}
 
  // ....
  // ....
};
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
std::string & toUpper(std::string & s)
{
  std::transform(s.begin(), s.end(), s.begin(), toupper);
  return s;
}
const std::string & January()
{
  static std::string jan("January");
  return jan;
}
int main(void)
{
  std::vector<std::string> authors { "A", "B", "C" };
  Book b1("Book1", authors, 1, "Jan", 2012);
 
  size_t year = 2012
  Book b2("Book2", { "A", "B", "C" }, 1, "Jan", year);
 
  std::string month = "Mar";
  Book b3("Book3", { "Author" }, 1, toUpper(month), 2012)
 
  Book b4("Book4", { "Author" }, 1, January(), 2012);
 
  std::string book = "Book";
  Book b5(std::move(book), std::move(authors), 1, std::move(month), year);
 
  Book b6("Book", { "Author" }, 1, "Jan", 2012);
}
И объяснения:
In case of b1, except for authors all other parameters are copied and moved once.
In case of b2, all strings and vectors are copied and moved once. That's what matters.
In case of b3, toUpper returns an string reference; everything else copied and moved only once.
In case of b4, January returns a const string reference; everything else copied and moved once.
In case of b5, strings are vector are moved as expected and in fact the b5 object the local parameters are created using move-constructor and moved again into the data member. Hence the object is created without any deep copies (like zero-copy).
 
Текущее время: 19:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru