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


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

Параметр "parameter" — это ссылка на уникальный указатель констант, использовать const T* или const T& вместо него (r.32)

Как правило, ссылки на константный уникальный указатель бессмысленны. Их можно безопасно заменить необработанной ссылкой или указателем. Это предупреждение применяет правило основных рекомендаций C++ R.32.

Замечания

  • Уникальные проверки указателя имеют довольно широкие критерии для определения смарт-указателей. Правило основных рекомендаций C++ R.31: если у вас есть не std smart pointers, следуйте базовому шаблону из std описывает уникальные указатели и общие понятия указателя. Эвристика проста, но может привести к сюрпризам: умный тип указателя является любым типом, который определяет либоoperator->.operator* Тип с поддержкой копирования (общий указатель) должен иметь либо открытый конструктор копирования, либо перегруженный оператор назначения, который имеет дело с параметром ссылки, отличного от Rvalue.

  • Код шаблона может создавать шумные предупреждения. Помните, что шаблоны можно создать с различными параметрами типа с различными уровнями косвенного обращения, включая ссылки. Некоторые предупреждения могут не быть очевидными, и исправления могут потребовать некоторых переработок шаблонов (например, явное удаление ссылочного косвенного обращения). Если код шаблона намеренно универсальный, предупреждение можно отключить.

Имя анализа кода: NO_REF_TO_CONST_UNIQUE_PTR

Пример

Ненужная ссылка:

std::vector<std::unique_ptr<Tree>> roots = GetRoots();
std::for_each(
    roots.begin(),
    roots.end(),
    [](const auto &root) { Rebalance(root.get()); });   // C26410