c++ - 尝试创建临时对象时出现奇怪的编译器错误

标签 c++ most-vexing-parse

在我发布之后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/

相关文章:

c++ - 如何在 64 位 DLL 中查找导出函数的地址?

c++ - I(I()) 的含义

c++ - Test t; 之间有什么区别?和测试 t();?如果 Test 是一个类

C++ 函数定义和变量声明不匹配?

c++ - 二维数组 C++ 三角形

C++、ANTLR 和 VECTORS

c++ - MFC中如何从CTabCtrl获取当前Tab Item名称?

C程序中的C++ dll

c++ - 关于最令人烦恼的解析的一个令人困惑的细节

c++ - 关于最令人烦恼的解析的一个令人困惑的细节