[[nodiscard]] для std::unique_ptr::release , новый метод std::unique_ptr::forget_ownership

ilnurkh
ilnurkh

предлагается поставить параметр [[nodiscard]] для release чтобы было сложнее не заметить потерю владения

для того чтобы использовать release для специаольной отмены владиния предлагается добавить метод void std::unique_ptr::forget_ownership() { auto tmp = this->release(); (void)(tmp);}

Можно сделать это же ещё и для других типов указателей.

2
рейтинг
9 комментариев
yndx-antoshkka

Ещё надо добавить для guardов.

Надо будет писать proposal. Готовы? Есть желающие?

yndx-antoshkka
Andrey

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
}
Andrey
yndx-antoshkka

Andrey, я имел в виду только метод release() для всех guard

yndx-antoshkka
Andrey

yndx-antoshkka, понял, то есть, получается речь идет только об unique_lock::release(), больше, в стандартной библиотеке пока нет guard'ов с методом release()?

Andrey
Andrey

Идея была рассмотрена тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0600r1.pdf но отвергнута.

Andrey
yndx-antoshkka

Andrey, идея была принята в том виде что изложено в бумаге. Но ни в бумаге, ни при обсуждении речь не заходила о методах release().

Так что надо писать новую бумагу, на добавлние [[nodiscard]] к release() методам умных указателей и guardов

yndx-antoshkka
Andrey

yndx-antoshkka, в бумаге сказано про unique_ptr::release(), что к нему добавлять [[nodiscard]] не предлагается, потому что в Google в 3.5% результат unique_ptr::release() дискардится но это все не баги.

Andrey
Обновлено 
yndx-antoshkka

Andrey, и правда, этот момент я проглядел. Спасибо!

Тогда бессмысленно в ближайшее время опять поднимать этот вопрос.

yndx-antoshkka
Саша Зайцев

yndx-antoshkka, сложно будет пробить, если есть примеры на кодовой базе. Вот если бы были доказательства обратного... то тогда было бы легче. Можно  было бы сделать по аналогии с исследованием о привнесении багов при изменении if(a < b < c)

Саша Зайцев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения