共用方式為


警告 C26411

參數 'parameter' 是唯一指標的參考,而且永遠不會重新指派或重設、使用 T* 或 改用 或 T& (r.33)

當您以傳址方式將唯一指標傳遞至函式時,表示其資源可能會在函式內釋放或傳輸。 如果函式只使用其參數來存取資源,則傳遞原始指標或參考是安全的。 如需詳細資訊,請參閱 C++ 核心指導方針規則 R.33取得unique_ptr<widget& 參數來表示函式重新配置小工具>

備註

  • 警告 C26410 的限制也適用於這裡。

  • 偵測 releasereset 存取唯一指標的啟發學習法是天真。 我們只會偵測指派運算符和具名 reset 函式的呼叫(不區分大小寫)。 顯然,此偵測並未涵蓋智慧型手機指標修改的所有可能案例。 (例如,它不會偵測 std::swap到 自定義智慧指標中的任何特殊非const 函數)。 我們預期此警告可能會在自定義類型上產生許多誤判,而且在某些情況下會處理標準唯一指標。 我們預期會改善啟發學習法,因為我們實作更多專注於智慧型手機指標的檢查。

  • 智慧型指標通常是範本帶來有趣的限制。 如果未使用範本,則不需要編譯程式來處理範本程式代碼。 在限制使用智慧型手機指標介面的程式代碼中,檢查程式可能會產生非預期的結果。 檢查程式無法正確識別範本類型的語意,因為某些函式可能永遠不會使用。 針對標準 std::unique_ptr,此限制可藉由辨識類型的名稱來減輕。 未來可能會擴充此分析,以涵蓋更知名的智慧型手機。

  • 執行隱含擷取傳址的 Lambda 運算式可能會導致關於唯一指標參考的令人驚訝警告。 目前會報告 Lambda 中所有擷取的參考參數,不論是否重設。 未來的版本可能會擴充啟發學習法,以將 Lambda 字段和 Lambda 參數相互關聯。

程式代碼分析名稱: NO_REF_TO_UNIQUE_PTR

範例:不必要的參考

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}