在我发表了这个问题之后,我尝试重现创建作用域RAII对象时发生意外rvalue创建的问题。现在看来,我无法在没有编译器错误的情况下重现它!
在以下代码示例中,在
在以下代码示例中,在
Test::foo()
中,第二个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
ScopedLock(this->mutex);
。这个编译得很好。 - StackedCrooked