С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567

Конструктор перемещения

31.08.2017, 17:59. Показов 1313. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Вот почитал про прямую передачу начиная с С++11. Решил использовать в своем приложении. Но оказывается если реализовать конструктор класса, то он может принемать объекты других классов. Как сделать так, чтобы через конструктор прямой передачи в зависимости от lvalue или rvalue этого объекта можно было не использовать конструктор копии или конструктор перемещения.

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
class point : public shape {
public:
 
    template<typename Args>
    point(Args&& args) {
 
        cout << "invoke perfect point ctr" << endl;
    }
 
    point() {
        cout << "invoke point ctr" << endl;
    }
 
    point(int x, int y) : x(x), y(y) {
        cout << "invoke point ctr" << endl;
    }
 
    ~point() {
        cout << "invoke point dtr" << endl;
    }
 
    int getX() const { return x; }
    int getY() const { return y; }
 
    void setX(int x) { this->x = x; }
    void setY(int y) { this->y = y; }
 
private:
    int x;
    int y;
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2017, 17:59
Ответы с готовыми решениями:

Конструктор перемещения
Правильно написан конструктор, значения в right нужно обнулять или не нужно? class Test { private: int count_; // Кол-во...

Конструктор перемещения
#include &lt;iostream&gt; #include &lt;memory&gt; using namespace std; class A { int x; public: A(int _x) : x(_x){}; ...

Конструктор перемещения
Здравствуйте. У меня есть такой класс: class Organization { char *name; int year, staffQual; double salaryFund;

8
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
31.08.2017, 18:53
В С++ нет конструкторов прямой передачи.
Есть конструктор по умолчанию, конструктор копирования и конструктор перемещения.

Не очень понятно что вы хотите сделать
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
31.08.2017, 19:05
Kotik_leapold,
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
Как сделать так, чтобы через конструктор прямой передачи в зависимости от lvalue или rvalue этого объекта можно было не использовать конструктор копии или конструктор перемещения.
Я так понимаю, Вы называете вот этот конструктор template<typename Args> point(Args&& args) конструктором прямой передачи? Нет, он так не называется. Это шаблонный конструктор, в котором работает особое правило сворачивания ссылов для rvalue-ссылок в различных случаях. К примеру, если Вы передадите в конструктор переменную типа float(lvalue):
C++
1
2
3
4
...
float a = 3.4f;
point p( a );
...
то тип Args&& у шаблона станет float&, и следовательно в конструктор передался параметр по ссылке.
Если вы передадите литерал, тоесть временный объект(rvalue):
C++
1
2
3
...
point p( 3.4f );
...
то тип Args&& у шаблона станет float. Это правило сворачивания ссылок.

поэтому при разных типах Args будет выполнен именно этот конструктор, только разный вывод параметра будет и все.
0
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
31.08.2017, 22:54
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
Как сделать так, чтобы через конструктор прямой передачи в зависимости от lvalue или rvalue этого объекта можно было не использовать конструктор копии или конструктор перемещения
Конструктор копии или перемещения считается более предпочтительным по правилам разрешения перегрузки и не может быть шаблонным.
Поэтому при copy- или move-иниициализации класса объектом того же класса будет вызываться нешаблонный конструктор копии или перемещения, а не конструктор, инстанциированный из шаблона.
0
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
01.09.2017, 09:12  [ТС]
Спасибо. Но вы не показали как сделать то что я хочу.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
01.09.2017, 17:48
Kotik_leapold, Вы не достаточно корректно объяснили что Вы хотите
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.09.2017, 23:40
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
Но вы не показали как сделать то что я хочу.
Кликните здесь для просмотра всего текста
https://www.youtube.com/watch?v=LOw-xqTLBzE&feature=youtu.be
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.09.2017, 08:04
Это имелось ввиду?
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
class point : public shape {
public:
 
    template<typename Args>
    point(Args&& args) {
 
        cout << "invoke perfect point ctr" << endl;
    }
 
    point() {
        cout << "invoke point ctr" << endl;
    }
 
    point(int x, int y) : x(x), y(y) {
        cout << "invoke point ctr" << endl;
    }
 
    ~point() {
        cout << "invoke point dtr" << endl;
    }
 
    int getX() const { return x; }
    int getY() const { return y; }
 
    void setX(int x) { this->x = x; }
    void setY(int y) { this->y = y; }
 
private:
   point( point && ) = delete;
   point( const point & ) = delete;
 
    int x;
    int y;
};
Добавлено через 2 минуты
Хотя, видимо, я поспешил.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.09.2017, 11:12
Kotik_leapold, вы натолкнулись на известную проблему с использованием "универсальных ссылок" (если так обозвать это понятие). Подробно у Мейерса рассматривается это в книге "Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2017, 11:12
Помогаю со студенческими работами здесь

Конструктор перемещения
Здравствуйте, пытаюсь уже некоторое время разобраться с move-семантикой. Честно говоря возникли сложности сразу же. Помогите пожалуйста...

C++11 Конструктор перемещения
Добрый день. Решил тут познакомится с конструктором перемещения, и сразу протестировал кое-что. Конструктор перемещения просто изымает...

Конструктор перемещения и оптимизация
Имеем тестовый код: #include &lt;iostream&gt; using namespace std; struct A { A( int v ) { cout &lt;&lt;...

Не срабатывает конструктор перемещения
Есть класс у которого удалён конструктор перемещения. Но тем не менее, при передаче обьекта данного класса в функцию по rvalue ссылке через...

Синтезируемый конструктор перемещения
Насколько я знаю, при определении в классе пользовательского конструктора копирования компилятор не должен сам генерировать конструктор...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru