Продление жизни rvalue до конца блока через (void)

Antervis
Antervis

Чтобы временный объект дожил до конца блока, необходимо поместить его в какую-либо переменную:

// Удаление объекта при выходе из scope
auto temp = unique_ptr(ptr,deleter);

После чего большинство компиляторов ругнутся на неиспользуемую переменную temp, соответственно добавляем

(void)temp;

При этом, переменная temp всё еще будет видима, хотя её использование дальше по тексту не подразумевается. Также могут быть проблемы при написании макросов (например, того же scoped-exit) - "переменная с таким именем уже существует".

Предлагаемый вариант:

(void) foo();

 

Насколько я знаю, на данный момент стандарт не запрещает использование подобного синтаксиса, однако он не имеет смысла и поэтому влияние изменения на существующий код крайне маловероятно.

-3
рейтинг
2 комментария
yndx-antoshkka
Синтаксис такой делать не стоит, т.к. он уже используется для того чтобы убрать предупреждение при игнорировании результата вызова функции с [[nodiscard]].

Работа в этом направлении международным комитетом уже ведётся, различные варианты решения уже обсуждаются. Пока к единому синтаксису не пришли.
yndx-antoshkka
dix75
yndx-antoshkka,
Как обычно, решение данного вопроса может занять продолжительное время.
dix75
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).