среда, 21 февраля 2018 г.

[prog.thoughts] Запись "_ = some()" в С++ -- это извращение или нет?

В связи с тем, что в C++ завезли атрибут [[nodiscard]], да и в чистом C благодаря расширениям компиляторов ряд функций помечается соответствующим образом, становится актуальным явное обозначение в коде тех мест, где возвращаемое значение функции намеренно игнорируется.

Только вот использовать для этого запись вида:

(void)::pipe(pipefd_);

(void)::fcntl(write_pipefd(), F_SETFL, O_DIRECT | O_NONBLOCK);
(void)::fcntl(read_pipefd(), F_SETFL, O_DIRECT | O_NONBLOCK);

мне лично не нравится. Нравится так, как это было принято в других языках:

_ = ::pipe(pipefd_);

_ = ::fcntl(write_pipefd(), F_SETFL, O_DIRECT | O_NONBLOCK);
_ = ::fcntl(read_pipefd(), F_SETFL, O_DIRECT | O_NONBLOCK);

Что достигается очень простой вспомогательной конструкцией:

// Вспомогательная штука, чтобы подавить предупреждения об игнорировании
// возвращаемого значения.
namespace {
   struct just_ignore_t {
      template<typename T> void operator=(T) {}
   } _;
}

Правда, боюсь, если это и найдет свое применение в C++, то очень ограниченное. Но смотрится прикольно :)

Комментариев нет: