3

この質問を投稿した後、スコープ付き RAII オブジェクトを作成するときに右辺値が偶発的に作成されるという問題を再現しようとしました。コンパイル エラーなしでは再現できないようです。

次のコード サンプルではTest::foo()、​​2 番目の 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
4

2 に答える 2

5

ユーザーが宣言したコンストラクターが 2 つあるため、コンパイラーによって生成されたデフォルトのコンストラクターはありません。

はい、

Type (i);

と同じように扱われます。

Type i;

このような括弧は、次のようなより複雑な宣言で役立ちます。

Type (*i)();

型を返す関数へのポインターを宣言します。

于 2011-03-01T19:48:31.660 に答える
0

このメッセージは、ScopedLock にはデフォルトのコンストラクター、つまり引数を取らないコンストラクターがないことを示しています。引数を取るコンストラクターを宣言すると、C++ はデフォルトのコンストラクターを作成しません。

于 2011-03-01T19:54:00.467 に答える