警告 C26417
共用指標參數會以傳址方式傳遞,而不會重設或重新指派。 請改用 T* 或 T& 。
C++ 核心指導方針: R.35:取得shared_ptr<widget>& 參數來表示函式可能會重新配置共用指標
以傳址方式傳遞共用指標在呼叫程式代碼更新智慧型手機針對象的目標案例中可能很有用,而其呼叫端預期會看到這類更新。 僅使用參考來降低傳遞共享指標的成本是值得懷疑的。 如果呼叫的程式代碼只會存取目標物件,而且永遠不會管理其存留期,傳遞原始指標或參考會更安全,而不是公開資源管理詳細數據。
備註
這項檢查可
std::shared_pointer
辨識和使用者定義類型,這些類型的行為可能會像共用指標一樣。 使用者定義共享指標預期會有下列特性:多載取值或成員存取運算元(公用和非刪除):
複製建構函式或複製指派運算元(公用和非刪除):
未刪除或預設的公用解構函式。 空解構函式仍會算作用戶定義。
重設或重新指派的動作會以更一般的方式解譯:
對共享指標上非常數函式的任何呼叫都可能會重設指標;
任何接受非常數共用指標參考的函式呼叫,都可能會重設或重新指派該指標。
範例
不必要的介面複雜功能
bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e))
e = std::make_shared<event>(e->id());
// ...
}
不必要的介面複雜功能 - 簡化
bool unregister(const event *e)
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e.get()))
e = std::make_shared<event>(e->id());
// ...
}