この質問を投稿した後、スコープ付き RAII オブジェクトを作成するときに右辺値が偶発的に作成されるという問題を再現しようとしました。コンパイル エラーなしでは再現できないようです。
次のコード サンプルではTest::foo()
、2 番目の ScopedLock の作成はコンパイルされません。gcc コンパイラ エラーは完全に間違っているようです。誰でも説明できますか?
struct Mutex
{
void lock() { }
void unlock() { }
};
struct ScopedLock
{
ScopedLock(Mutex & inMutex) : mMutex(inMutex)
{ mMutex.lock(); }
~ScopedLock()
{ mMutex.unlock(); }
private:
ScopedLock(const ScopedLock&);
ScopedLock& operator=(const ScopedLock&);
Mutex mMutex;
};
struct Test
{
void foo()
{
// Compiles fine
ScopedLock lock(mMutex);
// Error: no matching function for
// call to ‘ScopedLock::ScopedLock()’
ScopedLock(mMutex);
}
Mutex mMutex;
};
MacでGCC 4.2.1を使用しています。
アップデート
元のコードを調べたところ、メンバーがthis
ポインターを介して参照されていることがわかりました。
ScopedLock(this->mMutex); // short-lived temporary and compiles fine