7

Visual Studio 2012 Release Candidate、C++ を使用して、少し大きなプロジェクトをコンパイルしようとしています。プロジェクトは現在、VS2010 を使用してコンパイルされています。(私はC++ 11のものを手に入れることに貪欲なので、試しました。:)

自分で説明できることは別として、プロジェクトでは次のようなコードを使用します。

ostringstream ostr;
ostr << "The " __FUNCTION__ "() failed to malloc(" << i << ").";
throw bad_alloc(ostr.str().c_str());

コンパイラが文句を言うようになりました

error C2248: 'std::bad_alloc::bad_alloc' : cannot access private member declared 
    in class 'std::bad_alloc'

...これは本当です。そのバージョンのコンストラクターは非公開になりました。

そのバージョンのコンストラクターを非公開にする理由は何でしたか? そのコンストラクターを引数で使用しないことがC++ 11標準で推奨されていますか?

(割り当てが失敗した場合、何か新しいものを構築しようとすると、より多くの問題が発生する可能性があると想像できます。ただし、それは私の推測にすぎません。)

ありがとう、ペトル

4

2 に答える 2

14

C++11 標準ではbad_alloc、次のように定義されています (18.6.2.1)。

class bad_alloc : public exception {
public:
    bad_alloc() noexcept;
    bad_alloc(const bad_alloc&) noexcept;
    bad_alloc& operator=(const bad_alloc&) noexcept;
    virtual const char* what() const noexcept;
};

文字列を受け取るコンストラクターはありません。そのようなコンストラクターを提供するベンダーは、他のベンダーがそれを提供する義務がないため、それを使用するコードを移植できなくなります。

C++03 標準では、同様の一連のコンストラクターが定義されているため、VS は C++11 より前であっても標準のこの部分には従いませんでした。MS は VS を可能な限り標準に準拠させようとしているため、おそらくその機会 (新しい VS、新しい標準) を使用して非互換性を修正しただけです。

編集: VS2012のコードを見たので、言及されたコンストラクターが完全に削除されるのではなく、非公開のままになっている理由も明らかですbad_array_new_length。クラスでそのコンストラクターを使用するのは1つだけのようです。したがって、bad_alloc でbad_array_new_lengtha が宣言されているため、そのプライベート コンストラクターを使用できます。によって使用されるポインタにメッセージを格納するだけでfriendあれば、この依存関係は回避できたはずですが、とにかく多くのコードではありません。bad_array_new_lengthwhat()

于 2012-06-27T20:23:50.457 に答える