共用方式為


警告 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);
    // ...
}