Выполнить оператор по указателю без разыменования

У меня есть переменная бафф, который перегружен = оператор. эта переменная используется в лямбде и передается по указателю. когда я хочу использовать этот оператор, я бы сделал:

*buf=CreateBuffer(w, h, type, c);

Однако он разыменовывает указатель и деструктор вызывается в конце области видимости, что не должно происходить.

Поэтому для предотвращения вызова деструктора я делаю:

buf->operator=(CreateBuffer(w, h, type, c));

Есть ли другое нормальное соглашение для достижения оператора = без этой длинной версии?

1 ответ

выполнить оператор по указателю

Ваш оператор перегружен не для указателя, а для указанного типа. Поэтому вы не можете "выполнить оператор по указателю". Чтобы выполнить оператор для указанного объекта, необходимо разыменовать указатель либо с помощью * или же ->,

Однако он разыменовывает указатель и деструктор вызывается в конце области видимости, что не должно происходить.

Разыменование указателя не вызывает деструктор, если у вас нет странной перегрузки для operator* (что вы не можете иметь, если buf является примитивным указателем, а не классом-оберткой).

Я подозреваю, что вы наблюдаете деструктор временного, который создается из-за преобразования из CreateBuffer в decltype(*buf)Хотя это невозможно без mcve.

Другие вопросы по тегам