Поделиться через


Предупреждение C26416

Параметр общего указателя передается ссылкой rvalue. Вместо этого передайте по значению.

Основные рекомендации по C++: R.34: примите параметр мини-приложения> shared_ptr<, чтобы выразить, что функция является владельцем части

Передача общего указателя по ссылке rvalue редко требуется. Если это не реализация семантики перемещения для самого типа общего указателя, объекты общего указателя можно безопасно передавать по значению. Использование ссылки rvalue также может быть признаком того, что уникальный указатель более подходящий, так как он четко передает уникальное владение от вызывающего абонента.

Замечания

  • Эта проверка распознает std::shared_pointer и определяемые пользователем типы, которые, скорее всего, будут вести себя как общие указатели. Для определяемых пользователем общих указателей ожидаются следующие признаки:

  • перегруженные операторы деконференции или доступа к членам (общедоступные и не удаленные);

  • конструктор копирования или оператор назначения копирования (открытый и не удаленный);

  • общедоступный деструктор, который не удаляется или не используется по умолчанию. Пустые деструкторы по-прежнему считаются пользовательскими.

Примеры

Сомнительные оптимизации конструктора:

action::action(std::shared_ptr<transaction> &&t) noexcept // C26416
    : transaction_(std::move(t))
{}

action::action(std::shared_ptr<transaction> &t) noexcept  // also C26417 LVALUE_REF_SHARED_PTR
    : transaction_(t)
{}

Оптимизация сомнительных конструкторов — упрощенная:

action::action(std::shared_ptr<transaction> t) noexcept
    : transaction_(std::move(t))
{}