在我发布之后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
最佳答案
您有两个用户声明的构造函数,因此没有编译器生成默认构造函数。
是的,
Type (i);
处理方式与
相同Type i;
这样的括号在更复杂的声明中很有用,例如
Type (*i)();
声明指向返回类型的函数的指针。
关于c++ - 尝试创建临时对象时出现奇怪的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159438/