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

第一种构造实际上并不是构造对象。为了使用默认构造函数在堆栈上创建对象,您必须()省略

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 回答