Можно ли анонимный объект объявить статическим в C++?

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

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

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

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

Спасибо.


person Igor Oks    schedule 24.12.2008    source источник


Ответы (4)


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

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

person Charlie Martin    schedule 24.12.2008

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

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

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

void foo()
{
    new A();
}

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

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

person Judge Maygarden    schedule 24.12.2008

Почему-то я думаю, что этому парню нужен побочный эффект конструктора синглтона.

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

person Joshua    schedule 24.12.2008
comment
Именно поэтому я смотрю на этот вопрос (7 лет спустя). Я хочу создать объект с глобальной областью действия, но не хочу, чтобы у него было имя. Он регистрируется с некоторыми другими объектами в своем конструкторе, поэтому ему не нужно имя. - person David Grayson; 17.05.2015

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

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

person GiM    schedule 14.07.2009