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

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

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

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

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

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 019
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

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

void foo()
{
    new A();
}

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

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

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

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

Именно поэтому я задаю себе этот вопрос (7 лет спустя). Я хочу создать объект с глобальной областью видимости, но не хочу, чтобы у него было имя. Он регистрирует себя с некоторыми другими объектами в своем конструкторе, поэтому ему не нужно имя.

David Grayson 17.05.2015 21:48

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

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

Другие вопросы по теме