Операторы выражения не должны быть явными вызовами только конструкторов временных объектов
Операторы выражения не должны быть явными вызовами только конструкторов временных объектов.
Объекты, которые компилятор создает на короткое время, а затем удаляет, являются временными объектами. Компилятор может создавать временные объекты для определенных целей, таких как:
Инициализация ссылок
Хранение значений, возвращаемых функциями
Типовое литье
Обработка исключений
Временные объекты уничтожаются, когда выражение, которое требует их конструкции, полностью оценивается. Например, при оценке выражения 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® помечает любой оператор выражения, который создает неназванный объект и не использует его. Вы можете создавать неназванные временные объекты, когда используете объекты в операторе выражения объявления. Например, временный объект, который используется в качестве возврата функции или в правой части назначения, соответствует этому правилу.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Операторы |
Категория: Необходимый, Автоматизированный |