Может ли анонимный объект быть объявлен статическим в C ++? - PullRequest
2 голосов
/ 24 декабря 2008

Это разрешено? :

class A;
void foo()
{
    static A();
}

Я получаю сигнал 11, когда пытаюсь это сделать, но следующее работает нормально:

class A;
void foo()
{
    static A a;
}

Спасибо.

Ответы [ 4 ]

4 голосов
/ 24 декабря 2008

Вы можете создать «анонимную» автоматическую переменную, но не статическую. Следующее создаст объект класса A и вызовет конструктор, а затем вызовет деструктор при выходе из функции.

class A;
void foo()
{
    A();
}

Подобный эффект можно получить, разместив объект в куче или построив его на месте в заранее выделенном месте.

void foo()
{
    new A();
}

void foo()
{
    static char memory[sizeof (A)];
    new (memory) A();
}

Однако в обоих случаях объект не может быть правильно очищен, так как указатель не удерживается для последующего вызова для удаления. Даже если статическая память будет освобождена, деструктор никогда не будет вызван. Анонимные объекты действительно создаются только после использования с сборщиком мусора.

4 голосов
/ 24 декабря 2008

Неа. В C ++ нет такого понятия, как «анонимный объект». Существует такая вещь, как определение объекта типа A, который немедленно отбрасывается; то, что вы написали, это выражение, которое возвращает объект A, который никогда не назначается переменной, как, например, код возврата printf, обычно никогда не назначается и не используется.

В этом коде, если бы он работал, вы бы объявили «никакой объект» для размещения вне кучи. Поскольку нет объекта для размещения, это бессмысленно.

3 голосов
/ 24 декабря 2008

Каким-то образом, я думаю, что этот парень после побочного эффекта конструктора-одиночки.

В любом случае, просто дайте штопке название переменной.

0 голосов
/ 14 июля 2009

Конечно, в C ++ есть анонимных объектов! A (100) - анонимный объект в этом примере

Однако, если вы об этом думаете, нет смысла создавать статический анонимный объект.

...