2

オブジェクトの作成後に、オブジェクトのコンストラクターを再度呼び出すことはできますか?

#include <iostream>

struct A
{
    A ( ) { std::cout << "A::A" << std::endl; }
    ~A ( ) { std::cout << "A::~A" << std::endl; }
};

int main( )
{
    A a;
    a.~A();    // OK
    a.A::A();  // OK in Visual Studio 2005, 2008, 2010

    return 0;
}
4

2 に答える 2

11

メンバー関数呼び出しとして、このようなコンストラクターを呼び出すことはできません。理由は(n3242、12.1 / 2)です:

コンストラクターは、そのクラスタイプのオブジェクトを初期化するために使用されます。コンストラクターには名前がないため、名前の検索中にコンストラクターが見つかることはありません。ただし、関数表記(5.2.3)を使用した明示的な型変換により、オブジェクトを初期化するためにコンストラクターが呼び出されます。

本当にオブジェクトであるはずの何かに対してコンストラクターを呼び出したい場合、そして非常に特別な場合を除いてそれを行うべきではない場合は、コンストラクターを呼び出す新しい配置を使用できます。

new (&a) A();
于 2012-07-07T21:10:47.297 に答える
8

ええと、a.A()C ++でコンストラクターを呼び出すことができないため、コンパイルに失敗します。(間接的に呼び出すこともできますが、いくつかの方法で呼び出すことができます。)同じ理由で、コンパイルa.A::A() すべきではないと思います。

于 2012-07-07T21:04:06.560 に答える