выделение C++ на стеке, действующем любопытно

Любопытные вещи с 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;
        }
}

Compied с g ++:

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

Первый тип выделения не создает объект. Что я пропускаю?

5
задан moala 18 February 2010 в 23:24
поделиться

3 ответа

Первый тип конструкции фактически не создает объект. Чтобы создать объект в стеке с помощью конструктора по умолчанию, вы должны опустить ()

Object myObjectOnTheStack;

. В вашем текущем стиле определения вместо этого объявляется функция с именем myObjectOnTheStack, которая возвращает Object .

12
ответ дан 18 December 2019 в 09:07
поделиться

Еще один пример "самого неприятного синтаксического анализа". Вместо определения объекта вы объявили функцию с именем myObjectOnTheStack , которая не принимает аргументов и возвращает объект .

4
ответ дан 18 December 2019 в 09:07
поделиться
Object myObjectOnTheStack();

это прямое объявление функции myObjectOnTheStack, не принимающей никаких параметров и возвращающей Object.

То, что вам нужно, это

Object myObjectOnTheStack;
2
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: