共用方式為


警告 C26441

Guard 物件必須命名 (cp.44)

C++ Core Guidelines

CP.44 :記得命名您的 lock_guard s 和 unique_lock s

備註

標準程式庫提供鎖定,協助控制其存留期間資源的平行存取。 當您宣告沒有名稱的鎖定物件時,編譯器會建立暫時物件,該暫存物件會立即解構,而不是位於封入範圍結尾的暫存物件。 因此,無法將鎖定物件指派給變數是有效停用鎖定機制的錯誤(因為暫時性變數是暫時性的)。 此規則會攔截這類非預期行為的簡單案例。

此診斷只會分析標準鎖定類型 std::scoped_lockstd::unique_lockstd::lock_guard 。 警告 C26444 涵蓋其他未命名的 RAII 類型。

分析器只會分析對建構函式的簡單呼叫。 更複雜的初始化運算式可能會導致錯誤的警告形式不正確。 分析器會忽略當做引數傳遞至函式呼叫或從函式呼叫傳回的鎖定。 無法判斷這些鎖定是否故意嘗試保護該函式呼叫,或是否應延長其 存留 期。 若要為函式呼叫所傳回的類型提供類似的保護,請使用 [[nodiscard]] 標注它們。 您也可以使用 [[nodiscard]] 標注建構函式,以避免該類型的未命名物件:

struct X { [[nodiscard]] X(); };

void f() {
    X{}; // warning C4834
}

分析器會忽略建立為暫時的鎖定,但指派給具名參考以延長其存留期。

程式碼分析名稱: NO_UNNAMED_GUARDS

範例

在此範例中,遺漏範圍鎖定的名稱。

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
        write_line(stream, text);
    }
}

若要修正錯誤,請為鎖定指定名稱,以延長其存留期。

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
        write_line(stream, text);
    }
}

另請參閱

C26444