警告 C26415
智慧型指標參數僅用於存取自主指標。 請改用 T* 或 T& 。
C++ 核心指導方針: R.30:只將智慧型手機指標作為參數,以明確表達存留期語意
使用智慧型指標類型將數據傳遞至函式,表示目標函式需要管理自主物件的存留期。 不過,假設函式只會使用智慧型指標來存取自主物件,而且永遠不會實際呼叫任何可能導致解除分配的程式代碼(也就是說,永遠不會影響其存留期)。 然後通常不需要讓介面與智慧型手機複雜化。 慣用內含物件的純指標或參考。
備註
這項檢查涵蓋大部分也會導致 C26410、C26415、C26417 和 C26418 的案例。 最好先清除SMART_PTR_NOT_NEEDED,然後切換至共用或唯一指標的邊緣案例。 如需更專注的清除,可以停用此警告。
除了標準 std::unqiue_pointer 和 std::shared_pointer 範本之外,這項檢查也會辨識可能要成為智慧型手機的使用者定義型別。 這類類型預期會定義下列作業:
- 公用且未標示為已刪除的多載取值或成員存取運算符。
- 未刪除或預設的公用解構函式,包括明確定義的空解構函式。
影響自主物件存留期之作業的解譯很廣泛,包括:
- 接受非常數智慧型手機指標之指標或參考參數的任何函式
- 複製或移動建構函式或指派運算元
- 非常數函式
範例
繁瑣的存留期管理。
bool set_initial_message(
const std::unique_ptr<message> &m) // C26415, also C26410 NO_REF_TO_CONST_UNIQUE_PTR
{
if (!m || initial_message_)
return false;
initial_message_.reset(m.get());
return true;
}
void pass_message(const message_info &info)
{
auto m = std::make_unique<message>(info);
const auto release = set_initial_message(m);
// ...
if (release)
m.release();
}
繁瑣的存留期管理 - 已重新作業。
void set_initial_message(std::shared_ptr<message> m) noexcept
{
if (m && !initial_message_)
initial_message_ = std::move(m);
}
void pass_message(const message_info &info)
{
auto m = std::make_shared<message>(info);
set_initial_message(m);
// ...
}