5

g++ の興味深い点 (他のコンパイラーとかも?):

struct Object {
        Object() { std::cout << "hey "; }
        ~Object() { std::cout << "hoy!" << std::endl; }
};

int main(int argc, char* argv[])
{
        {
                Object myObjectOnTheStack();
        }
        std::cout << "===========" << std::endl;
        {
                Object();
        }
        std::cout << "===========" << std::endl;
        {
                Object* object = new Object();
                delete object;
        }
}

g++ でコンパイル:

===========
hey hoy!
===========
hey hoy!

最初のタイプの割り当ては、オブジェクトを構築しません。私は何が欠けていますか?

4

3 に答える 3

12

最初のタイプの構築は、実際にはオブジェクトを構築していません。デフォルトのコンストラクターを使用してスタック上にオブジェクトを作成するには、()'sを省略する必要があります。

Object myObjectOnTheStack;

現在の定義スタイルでは、代わりに myObjectOnTheStack という名前の関数を宣言し、Object.

于 2010-02-18T23:27:05.830 に答える
4

「最も厄介な解析」のさらに別の例。myObjectOnTheStackオブジェクトを定義する代わりに、引数をとらず、 を返すという名前の関数を宣言しましたObject

于 2010-02-18T23:27:55.203 に答える
2
Object myObjectOnTheStack();

myObjectOnTheStackパラメータを取らず、 を返す関数の前方宣言ですObject

あなたが欲しいのは

Object myObjectOnTheStack;
于 2010-02-18T23:28:19.517 に答える