演算子new()を使用してクラスCの新しいオブジェクトを作成すると、ここでエラーが発生します。
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
と C2280: 'void C::operator delete(void *)': function was explicitly deleted
私は交換するときでもC() {}
とC() = default;
か、そのコンパイラが(私はと同じ効果を持つと信じデフォルトコンストラクタを挿入するように、行を削除= default
)、コードはコンパイルして実行します。
コンパイラが生成したデフォルトのコンストラクタとユーザー定義のデフォルトのコンストラクタの違いは何ですか?
私はこの投稿でいくつかのヒントを得ましたが、デストラクタが仮想なので、ここのクラスC(ユーザー提供のコンストラクタなし)は簡単ではありませんよね?
最新のVisual Studio、c ++ 17でコンパイルされています。
operator delete()
コンストラクターが手動で記述されているか、暗黙的に生成されているかに関する同様の診断。これは私の期待と一致していnew
ますoperator delete()
。式によって例外がスローされる可能性があるため、コンパイラはにアクセスする必要があります。
noexcept
するとコードがコンパイルされますが、どうやって...?
noexcept
SebastianRedlで言及されている場合は、への呼び出しをoperator delete
含める必要はありません。また、g ++は、デストラクタが仮想である場合にのみ文句を言います。それ以外の場合は、コンストラクターがスローしている場合でも、常にコンパイルされます。
noexcept