7

重複の可能性:
プライベート コピー コンストラクターを持つオブジェクトをスローできますか?

私が知っているように、オブジェクトを値としてトローすると、コピーが作成されます。したがって、コピーコンストラクターが存在する場合は呼び出す必要があります。コピー ctor が存在し、プライベートである場合、コンパイル エラーが発生するはずです。ここにコードサンプルがあります

class Exception {
public:
Exception() {
    cout << "Exception()" << endl;
}

~Exception() {
    cout << "~Exception() " << endl;
}
private:
Exception(const Exception &c) {
        cout << "Exception(c)" << endl;
    }
};

そして、次のコードはコンパイル エラーにつながるはずです。

try {
        Exception local;

        throw local;
    } catch (...) {
    }

しかし、VS 2005 と VS 2008 の両方で、そのコードを正常にコンパイルし、プライベート ctor を呼び出します。これが非標準の動作であり、コンパイラのエラーであるというのは間違っていますか?

4

2 に答える 2

0

標準では、 throw がコピーを作成する可能性があるため、例外はコピー可能でなければならないと述べています。コピー コンストラクターを非公開にしたため、コンパイルされません。

ただし、コピーを作成するために throw の実装が必要であるとは述べていません。したがって、MSVC は、標準に準拠していないという理由でコードのコンパイルを拒否する必要がありますが、MSVC のやり方で動作するため、それでもコンパイルを行います。

これはおそらくバグではなく、VC が標準に準拠していないという単なるケースです。

于 2012-06-05T15:55:27.863 に答える
0

これはおそらく正当な MSVC 10 のバグであると断言します。ただし、これに関する参照は見つかりません。

テスト ハーネスは次のとおりです。

#include <cstdlib>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;

class Exception {
public:
Exception() {
    cout << "Exception()" << endl;
}

~Exception() {
    cout << "~Exception() " << endl;
}
private:
Exception(const Exception &c) {
        cout << "Exception(c)" << endl;
    }
};

int main()
{
    try {
        Exception local;

        int n = 42;

        throw local;
    } catch (...) 
    {
    }
}

このコードは、メモした理由でコンパイルに失敗するはずです-コピーコンストラクターはprivate、クラスのコンテキストの外部から呼び出されています。

このコードは、MSVC 10 および MSVC 11 Dev Preview で正常にコンパイルされます。

RHEL6.2 の GCC 4.4.4 は以下を出力します。

[xxx@yyy ~]$ gcc --version
gcc (GCC) 4.4.4 20100726 (Red Hat 4.4.4-13)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[xxx@yyy ~]$ gcc hack.cpp 
hack.cpp: In function ‘int main()’:
hack.cpp:17: error: ‘Exception::Exception(const Exception&)’ is private
hack.cpp:29: error: within this context
[xxx@yyy ~]$ 
于 2012-06-05T14:12:28.997 に答える