Операторы expression не должны быть явными вызовами только конструкторов временных объектов
Выражения не должны быть явными вызовами только конструкторов временных объектов.
Объекты, которые компилятор создает на короткое время, а затем удаляет, являются временными объектами. Компилятор может создавать временные объекты для определенных целей, таких как:
Инициализация ссылок
Сохранение значений, возвращаемых функциями
Типовое литье
Обработка исключений
Временные объекты уничтожаются после полной оценки выражения, требующего их построения. Например, при оценке выражения sum = a*b+cкомпилятор создает два временных объекта для хранения результатов операций умножения и сложения. После вычисления выражения оба временных объекта уничтожаются. Их область действия ограничена оператором выражения.
Если выражение является явным вызовом конструктора, пропускающего имя объекта, компилятор создает временный объект, который немедленно уничтожается. Такой явный вызов конструктора может указывать на то, что:
Непреднамеренно пропущено имя объекта.
Вы ожидали, что неназванная переменная останется в области действия до конца блока объявления.
Рассмотрим этот фрагмент кода, где lock_guard создается объект.
void foo(){
std::mutex mymutex;
std::mutex mymutex2;
std::lock_guard<std::mutex> lock{mymutex};
std::lock_guard<std::mutex> {mymutex2};
//...
}lock_guard объект с именем lock. Объект lock защищает mymutex от параллельного доступа несколькими потоками до конца текущего блока. Во второй декларации предпринята попытка аналогичной защиты для mymutex2. Потому что lock_guard объект в этом случае не называется, он уничтожается сразу после объявления. Возможно, непреднамеренно, mymutex2 остается незащищенным от проблем параллелизма.Избегайте операторов выражений, которые являются только явным вызовом конструктора. Для реализации шаблона инициализации получения ресурсов (RAI) используйте именованные объекты.
Polyspace ® помечает любое выражение, которое создает неназванный объект и не использует его. Неименованные временные объекты можно создавать при использовании объектов в операторе выражения объявления. Например, временный объект, который используется как функция возврата или справа от назначения, соответствует этому правилу.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: выписки |
| Категория: Обязательно, Автоматизировано |