Size: a a a

2020 March 31

AT

Anatoly Tomilov in pro.cxx
можно всю композицию поместить в std::unique_ptr и сделать операторы присваивания deleted, но кажется в языке есть изъян или отсутствует возможность как-то задать порядок присваивания для составляющих композиции
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Так проблемы всё ещё нет. При move-assignment источник и цель, обычно, меняются содержимым, каждый остаётся конситентным. Исключения:
1. Они внутри своих move assign смотрят на "соседа выше" и что-то исходя из этого делают. Кажется, так плохо делать, ведь по сути тип лишает своё значение свободы его хранить где удобно.
1. Логика сложнее и её можно написать по правилу трёх/пяти.
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Это в целом напоминает разговоры, откуда могут быть проблемы с delete this;. Да по сути мало откуда, но когда обычно внешняя сторона управления объектом строго завязана изнутри его это может оказаться проблематичным, и так делать не очень хорошо.
источник

AN

Alexander N in pro.cxx
delete this это вообще бессмысленно
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
У вас действительно есть пример набора объектов, который перемещать или копировать (без операций между ними) надо строго в заданном порядке, не совпадающем с порядком объявления?
источник

AT

Anatoly Tomilov in pro.cxx
Дмитрий ⬡ Лапшин
Так проблемы всё ещё нет. При move-assignment источник и цель, обычно, меняются содержимым, каждый остаётся конситентным. Исключения:
1. Они внутри своих move assign смотрят на "соседа выше" и что-то исходя из этого делают. Кажется, так плохо делать, ведь по сути тип лишает своё значение свободы его хранить где удобно.
1. Логика сложнее и её можно написать по правилу трёх/пяти.
swap — это не требование. Поэтому moved-from операнд может остаться пустым
источник

AT

Anatoly Tomilov in pro.cxx
Дмитрий ⬡ Лапшин
У вас действительно есть пример набора объектов, который перемещать или копировать (без операций между ними) надо строго в заданном порядке, не совпадающем с порядком объявления?
да. Аллокация, затем буффер/image в Vulkan
источник

AT

Anatoly Tomilov in pro.cxx
буффер/image существует над аллокацией
источник

AT

Anatoly Tomilov in pro.cxx
разрушать их надо в порядке, обратном порядку инициализации (который совпадает с порядком конструирования, но это уже организационно)
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Anatoly Tomilov
да. Аллокация, затем буффер/image в Vulkan
Окей, понял. Варианты решения: буфер должен владеть аллокацией, move должен работать корректно (в плане: после него уничтожение источника перемещения должно быть ок), а то сейчас выглядит что вот такой код

image a, b;
a = move(b);

приведёт к ошибке. Тут мало чем поможешь, кроме как вместо мув писать свои костыли.
источник

AT

Anatoly Tomilov in pro.cxx
ладно. Это плохой пример. Там вообще если не используешь буффер/image, под который забинжена аллокация, ставшая невалидной, то это нормальная ситуация. Но всё равно похожий пример можно придумать, когда проблема будет.
источник

AT

Anatoly Tomilov in pro.cxx
Дмитрий ⬡ Лапшин
Окей, понял. Варианты решения: буфер должен владеть аллокацией, move должен работать корректно (в плане: после него уничтожение источника перемещения должно быть ок), а то сейчас выглядит что вот такой код

image a, b;
a = move(b);

приведёт к ошибке. Тут мало чем поможешь, кроме как вместо мув писать свои костыли.
Я бы мог вообразить аттрбут для оператора присваивания/перемещения Class & [[inverse_assignment]] operator = (Class &&) = default;, если это языковым всяким штукам теоретическим не противоречит
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Ну то есть мне кажется что в языке есть sound система времён жизни: создаётся в прямом, уничтожается в обратном, перемещается-копируется заведомо неизвестно в каком, смотри что владелец там творит (про которого сам класс ничего знать не может). Если надо вклиниться в процесс пожалуйста. А если не следовать этой парадигме то задачу очевидно можно раздуть до неразрешимой.
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Условно почти всегда когда есть ресурсы с неавтоматическими ссылками между ними придётся объяснять чего именно хочется.
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
А обратный порядок тут, ну условно, не так сильно поможет, потому что ровно так же строится пример, где порядок должен будет оказаться 1 4 2 3.
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
А на более глубоком уровне это например Rust, который избавляет от вопросов мув-операций, потому что ответ всегда один: тип или примитивно копируемый, или он всегда кроме явных мест перемещается и процесс перемещения тривиален до уровня бит.
источник

AB

Artöm Bakri Al-Sarmini in pro.cxx
Дмитрий ⬡ Лапшин
А на более глубоком уровне это например Rust, который избавляет от вопросов мув-операций, потому что ответ всегда один: тип или примитивно копируемый, или он всегда кроме явных мест перемещается и процесс перемещения тривиален до уровня бит.
Там перемещение разрушающее
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Artöm Bakri Al-Sarmini
Там перемещение разрушающее
Да, так правильнее сказать.
источник

CD

Constantine Drozdov in pro.cxx
Дмитрий ⬡ Лапшин
Да, так правильнее сказать.
Это другой тип перемещения
источник

CD

Constantine Drozdov in pro.cxx
Дмитрий ⬡ Лапшин
А обратный порядок тут, ну условно, не так сильно поможет, потому что ровно так же строится пример, где порядок должен будет оказаться 1 4 2 3.
Построение примера, когда порядок создания и удаления не совпадает, требует очень специфических операций
источник