[英]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);
}
有趣的是,代替A
的int
確實觸發了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.