からロックの参照を初期化:打ち鳴らす:このプログラムは打ち鳴らすによってコンパイルされたミューテックス
#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’
他にも類例がありません。
clangは間違いなく正しいですか?これは、ライブラリクラスを含まないより単純な例で再現できますか?私は試したが役に立たなかった。
編集これは、最小限の再現のようだ:興味深いことに、A
の代わりにint
は(私が最初にこれを再現することができなかった理由です)打ち鳴らすのエラーメッセージをトリガん
struct A {};
struct X
{
explicit X(A&) {};
};
int main()
{
A a;
const X& x(a);
}
。
そう...これはちょうど打ち鳴らすのバグですか?それは私の目のように見える... –
@ n.m .:私は*その*特定の呼び出しを行う資格はありません。上記は単なるエラーメッセージの説明です。私はその判断をより高い当局に委ねます... ;-) – DevSolar