powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual Stuido - как запретить использовать конструктор перемещения
25 сообщений из 54, страница 2 из 3
Visual Stuido - как запретить использовать конструктор перемещения
    #38826678
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly Moskovskyсинтаксиса инициализации дефолтным конструктором нет
egorychубери конструктор
Эта... Я чего-то не понимаю: нет синтаксиса инициализации несуществующим конструктором?..
если у тебя в классе нет ни одного конструктора, то компилятор тебе создаст конструктор по умолчанию... но в нём POD-данные не будут инициализированы, такая вот фигня ))
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826680
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭта... Я чего-то не понимаю: нет синтаксиса инициализации несуществующим конструктором?..
Вообще это называется default initialization (инициализация по умолчанию). Слово конструктор там лишнее.
Для синтаксиса
Код: plaintext
1.
Foo c;

инициализация по умолчанию производится путем вызова конструктора, при условии что у класса или его полей есть конструкторы, т.е. только для не-POD.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826685
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и для полноты картины:
для синтаксиса
Код: plaintext
1.
Foo c = Foo();


инициализация по умолчанию производится путем вызова конструктора для не-POD или нулями для POD.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826689
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНу и для полноты картины:
для синтаксиса
Код: plaintext
1.
Foo c = Foo();

инициализация по умолчанию производится путем вызова конструктора для не-POD или нулями для POD.а в С++11 это будет работать, или надо переписывать?
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826692
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Конечно будет, все обратно совместимо.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826701
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyegorych,

Конечно будет, все обратно совместимо.спасибо ))
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826702
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще нюансы (но все укладывается в вышесказанное).
Запощу пару примеров :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
struct S
{
    int a;
    string s;
};
S s = S(); // s.a == 0
S s; // s.a == мусор

struct S
{
    int a;
    string s;
    S() {}
};
S s = S(); // s.a == мусор
S s; // s.a == мусор
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826705
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чёрт, слишком стар я для этих подвыподвертов... Лучше уж останусь у одскульного "всё, что
не инициализировано явно - не инициализировано вообще".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826706
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЧёрт, слишком стар я для этих подвыподвертов... Лучше уж останусь у одскульного "всё, что
не инициализировано явно - не инициализировано вообще".
+1, так проще, и правильней
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826709
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С++11 все на самом деле проще :)

Код: plaintext
1.
2.
3.
4.
5.
struct S
{
    int a = 10;
    string s;
};


И все инициализируется всегда :)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826837
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MozokAnatoly MoskovskyПолучается, что если были copy-конструкторы, то надо реализовать и move-конструкторы, иначе будет использован дефолтный.
Фигня какая-то.
Надо почитать стандарт.
Сам я пока на с++11 не пишу, поэтому не сталкивался с этой темой.
Не-а, не будет:
ISO C++If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared
as defaulted if and only if
— X does not have a user-declared copy constructor,
— X does not have a user-declared copy assignment operator,
— X does not have a user-declared move assignment operator,
— X does not have a user-declared destructor, and
— the move constructor would not be implicitly defined as deleted.
[ Note: When the move constructor is not implicitly declared or explicitly supplied, expressions that otherwise
would have invoked the move constructor may instead invoke a copy constructor. —end note ]
То есть, tolyanchik'у достаточно убрать
Код: plaintext
1.
	Foo(Foo&&) = delete;


И никакого move-конструктора просто не будет.



По крайней мере, в VS такой подход не работает.
Move-ctor генерится автоматически.
Студия не позволяет его не использовать (если считает, что он нужен) :)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826839
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikПо крайней мере, в VS такой подход не работает.
Move-ctor генерится автоматически.
Студия не позволяет его не использовать (если считает, что он нужен) :)
Т.е. если вы объявляете move-к-тор, то он вызывается (и это подтвержается отладочной печатью)?
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826843
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky

Перепроверил - нет, почему-то move-ctor не вызывается (но и без него не хочет рабоать)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826844
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikПерепроверил - нет, почему-то move-ctor не вызывается (но и без него не хочет рабоать)
Теперь осталось выяснить что такое "не хочет работать".
Как вы определяете что не работает?
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826845
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь это выглядит совершенно бредово:)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826846
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В вашем коде из-за RVO может вообще не требоваться копирование.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826847
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[img=]
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826848
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826849
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда возникает вопрос, почему не компилит совершенно тривиальный код, ведь достаточно вызвать обычный конструктор копирования.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826850
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchik,

Потому что private функции недоступны извне класса :)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826851
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласно стандарту, при проведении оптимизаций компилятор дожен выдавать ошибки, которые были бы если бы оптимизации не было.
В частности без RVO было бы копирование перемещением из временной переменной, а оно у вас private
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826852
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это понятно, но если удалить move-ctor, обычный copy-ctor всё равно не вызывается.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826853
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, вам надо удалить move-ctor и все.
При этом в зависимости от оптимизаций либо будет вызываться copy-ctor либо ничего.
Никакой move-ctor не генерится если объявлен copy-ctor.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826854
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikЭто понятно, но если удалить move-ctor, обычный copy-ctor всё равно не вызывается.
Я же вам написал - это оптимизация RVO
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826855
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, спасибо!
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual Stuido - как запретить использовать конструктор перемещения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]