Sta*_*ked 3 c++ most-vexing-parse
发布此问题后,我尝试重现创建范围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;
};
Run Code Online (Sandbox Code Playgroud)
我在Mac上使用GCC 4.2.1.
我查看了原始代码,发现该成员是通过this指针引用的:
ScopedLock(this->mMutex); // short-lived temporary and compiles fine
Run Code Online (Sandbox Code Playgroud)
您有两个用户声明的构造函数,因此没有编译器生成的默认构造函数.
是,
Type (i);
Run Code Online (Sandbox Code Playgroud)
处理方式与处理方式相同
Type i;
Run Code Online (Sandbox Code Playgroud)
这样的括号在更复杂的声明中很有用,例如
Type (*i)();
Run Code Online (Sandbox Code Playgroud)
声明指向返回类型的函数的指针.
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |