【发布时间】:2011-03-01 19:38:53
【问题描述】:
在我发布this question 之后,我尝试重现在创建作用域 RAII 对象时意外创建右值的问题。现在看来,如果没有编译器错误,我就无法重现它!
在以下代码示例中,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
【问题讨论】:
-
嘿,我想知道你上一个问题的这个问题......语法意味着函数调用,而不是临时对象。您可能想问问您的同事,他的情况是否比他想象的更复杂。
-
是的,我明天一定要去看看。
-
@Shog9 原来他使用了以下语法:
ScopedLock(this->mutex);。编译得很好。
标签: c++ most-vexing-parse