簡體   English   中英

鐺:從互斥鎖初始化鎖引用

[英]clang: initialising a lock reference from a mutex

該程序由clang編譯:

#include <mutex>

int main() {
    std::mutex mtx;
    const std::lock_guard<std::mutex>& lock(mtx);
    return 0;
}

其他主要的編譯器拒絕它(我嘗試過gcc,msvc和icc)。 這是來自gcc的錯誤消息:

error: invalid initialization of reference of type ‘const 
       std::lock_guard<std::mutex>&’ from expression of type ‘std::mutex’

其他人給出類似的錯誤。

lang是對是錯? 可以用一個不涉及庫類的簡單示例來重現嗎? 我已經嘗試過,但沒有成功。

編輯這似乎是最小的復制:

struct A {};

struct X
{
    explicit X(A&) {};
};

int main()
{
    A a;
    const X& x(a);
}

有趣的是,代替Aint確實觸發了clang錯誤消息(這就是為什么我最初無法重現此錯誤的原因)。

我沒有C ++標准的相關章節。 我現在只能參考有關轉換構造函數的CppReference (重點是我的):

使用說明符進行顯式聲明的構造函數,並且可以使用單個參數(直到C ++ 11)調用該構造函數,構造函數稱為“ 轉換構造函數”

僅在直接初始化 (包括顯式轉換,例如static_cast)中考慮的顯式構造函數不同 ,在拷貝初始化期間,轉換的構造函數也作為用戶定義的轉換序列的一部分被考慮。

所以:

struct A {};

struct X
{
    explicit X(A const &) {};
};

int main()
{
    A a;
    const X& x1(A());                 // OK, direct init (no A object after init)
    const X& x3(a);                   // NOK, copy init
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM