Предупреждение C26418
Общий параметр указателя не копируется или не перемещается. Вместо этого используйте T* или T&.
Основные рекомендации по C++: R.36: примите параметр const shared_ptr<мини-приложения>, чтобы выразить, что он может сохранить число ссылок для объекта.
Если общий параметр указателя передается по значению или по ссылке на постоянный объект, функция должна контролировать время существования целевого объекта, не влияя на вызывающий объект. Код должен копировать или перемещать общий параметр указателя на другой общий объект указателя или передавать его в другой код, вызывая функции, принимающие общие указатели. В противном случае может оказаться возможным простой указатель или ссылка.
Замечания
Эта проверка распознает
std::shared_pointer
и определяемые пользователем типы, которые, скорее всего, будут вести себя как общие указатели. Для определяемых пользователем общих указателей ожидаются следующие признаки:перегруженные операторы деконференции или доступа к членам (общедоступные и не удаленные);
конструктор копирования или оператор назначения копирования (открытый и не удаленный);
общедоступный деструктор, который не удаляется или не используется по умолчанию. Пустые деструкторы по-прежнему считаются пользовательскими.
Примеры
ненужная сложность интерфейса
template<class T>
std::string to_string(const std::shared_ptr<T> &e) // C26418, also C26415 SMART_PTR_NOT_NEEDED
{
return !e ? null_string : e->to_string();
}
ненужное осложнение интерфейса — упрощенное
template<class T>
std::string to_string(const T *e)
{
return !e ? null_string : e->to_string();
}