Операторы выражения не должны быть явными вызовами только конструкторов временных объектов
Операторы выражения не должны быть явными вызовами только конструкторов временных объектов.
Объекты, которые компилятор создает на короткое время, а затем удаляет, являются временными объектами. Компилятор может создавать временные объекты для определенных целей, таких как:
Инициализация ссылок
Хранение значений, возвращаемых функциями
Типовое литье
Обработка исключений
Временные объекты уничтожаются, когда выражение, которое требует их конструкции, полностью оценивается. Например, при оценке выражения sum = a*b+cкомпилятор создает два временных объекта для хранения результатов операций умножения и сложения. После оценки выражения оба временных объекта уничтожаются. Их возможности ограничены оператором выражения.
Если выражение является явным вызовом конструктора, опускающего имя объекта, компилятор создает временный объект, который немедленно уничтожается. Такой явный вызов конструктора может указать, что:
Вы непреднамеренно опускали имя объекта.
Вы ожидали, что неназванная переменная останется в возможности до конца блока объявления.
Рассмотрим этот фрагмент кода, где a 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 остается незащищенным от проблем параллелизма.Избегайте операторов выражения, которые являются только явным вызовом конструктора. Чтобы реализовать шаблон Resource Acquisition Is Initialization (RAII), используйте именованные объекты.
Polyspace® помечает любой оператор выражения, который создает неназванный объект и не использует его. Вы можете создавать неназванные временные объекты, когда используете объекты в операторе выражения объявления. Например, временный объект, который используется в качестве возврата функции или в правой части назначения, соответствует этому правилу.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Операторы |
| Категория: Необходимый, Автоматизированный |