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