Выполнить оператор по указателю без разыменования
У меня есть переменная бафф, который перегружен = оператор. эта переменная используется в лямбде и передается по указателю. когда я хочу использовать этот оператор, я бы сделал:
*buf=CreateBuffer(w, h, type, c);
Однако он разыменовывает указатель и деструктор вызывается в конце области видимости, что не должно происходить.
Поэтому для предотвращения вызова деструктора я делаю:
buf->operator=(CreateBuffer(w, h, type, c));
Есть ли другое нормальное соглашение для достижения оператора = без этой длинной версии?
1 ответ
выполнить оператор по указателю
Ваш оператор перегружен не для указателя, а для указанного типа. Поэтому вы не можете "выполнить оператор по указателю". Чтобы выполнить оператор для указанного объекта, необходимо разыменовать указатель либо с помощью *
или же ->
,
Однако он разыменовывает указатель и деструктор вызывается в конце области видимости, что не должно происходить.
Разыменование указателя не вызывает деструктор, если у вас нет странной перегрузки для operator*
(что вы не можете иметь, если buf
является примитивным указателем, а не классом-оберткой).
Я подозреваю, что вы наблюдаете деструктор временного, который создается из-за преобразования из CreateBuffer
в decltype(*buf)
Хотя это невозможно без mcve.