これは許可されていますか?:
class A;
void foo()
{
static A();
}
実行しようとするとシグナル11が表示されますが、以下は正常に機能します。
class A;
void foo()
{
static A a;
}
ありがとうございました。
いいえ。C++には「匿名オブジェクト」のようなものはありません。すぐに破棄されるタイプAのオブジェクトを定義するようなものがあります。あなたが書いたのは、変数に割り当てられないAオブジェクトを返す式です。たとえば、printfの戻りコードは通常、割り当てられたり使用されたりすることはありません。
そのコードでは、それが機能した場合、ヒープの外部に割り当てられる「オブジェクトなし」を宣言することになります。割り当てるオブジェクトがないため、意味がありません。
「匿名」自動変数は作成できますが、静的変数は作成できません。次の例では、クラス A のオブジェクトを作成し、コンストラクタを呼び出してから、関数の終了時にデストラクタを呼び出します。
class A;
void foo()
{
A();
}
ヒープにオブジェクトを割り当てるか、事前に割り当てられた場所にオブジェクトを構築することで、同様の効果を得ることができます。
void foo()
{
new A();
}
void foo()
{
static char memory[sizeof (A)];
new (memory) A();
}
ただし、どちらの場合も、後で delete を呼び出すためにポインタが保持されないため、オブジェクトを正しくクリーンアップできません。静的メモリが解放されても、デストラクタが呼び出されることはありません。匿名オブジェクトは、ガベージ コレクターで使用した場合にのみ実際に作成されます。
どういうわけか、この男はシングルトンコンストラクターの副作用の後であると思います。
とにかく、すでにくそったれに変数名を付けてください。