Open apolukhin opened 3 years ago
yndx-antoshkka, 26 июля 2018, 15:27 Ещё надо добавить для guardов.
Надо будет писать proposal. Готовы? Есть желающие?
Andrey, 26 июля 2018, 15:33 yndx-antoshkka, для guard'ов нельзя, есть желающие программировать в таком стиле:
class MyThreadSafeClass {
std::mutex mutex_;
public:
std::unique_lock<std::mutex> do_something_under_lock()
{
std::unique_lock lock(mutex_);
do_something();
return lock;
}
void do_other_thing();
};
void use1(MyThreadSafeClass x)
{
auto lock = x.do_something_under_lock();
x.do_other_thing();
}
void use2(MyThreadSafeClass x)
{
x.do_something_under_lock(); // lock is discarded, but it's not an error
}
yndx-antoshkka, 26 июля 2018, 16:14 Andrey, я имел в виду только метод release() для всех guard
Andrey, 26 июля 2018, 17:02 yndx-antoshkka, понял, то есть, получается речь идет только об unique_lock::release(), больше, в стандартной библиотеке пока нет guard'ов с методом release()?
Andrey, 26 июля 2018, 15:29 Идея была рассмотрена тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0600r1.pdf но отвергнута.
yndx-antoshkka, 26 июля 2018, 16:15 Andrey, идея была принята в том виде что изложено в бумаге. Но ни в бумаге, ни при обсуждении речь не заходила о методах release().
Так что надо писать новую бумагу, на добавлние [[nodiscard]] к release() методам умных указателей и guardов
Andrey, 26 июля 2018, 16:49 yndx-antoshkka, в бумаге сказано про unique_ptr::release(), что к нему добавлять [[nodiscard]] не предлагается, потому что в Google в 3.5% результат unique_ptr::release() дискардится но это все не баги.
yndx-antoshkka, 26 июля 2018, 17:17 Andrey, и правда, этот момент я проглядел. Спасибо!
Тогда бессмысленно в ближайшее время опять поднимать этот вопрос.
Саша Зайцев, 27 июля 2018, 23:15 yndx-antoshkka, сложно будет пробить, если есть примеры на кодовой базе. Вот если бы были доказательства обратного... то тогда было бы легче. Можно было бы сделать по аналогии с исследованием о привнесении багов при изменении if(a < b < c)
Перенос предложения: голоса +5, -1 Автор идеи: ilnurkh
release и reset очень похожи, часто их начаянно путают получая утечки
предлагается поставить параметр [[nodiscard]] для release чтобы было сложнее не заметить потерю владения
для того чтобы использовать release для специаольной отмены владиния предлагается добавить метод void std::unique_ptr::forget_ownership() { auto tmp = this->release(); (void)(tmp);}
Можно сделать это же ещё и для других типов указателей.