Можно ли использовать анонимные классы в С++?

Я видел анонимные классы в C++ код на Quora. Он успешно скомпилирован и запущен.

Код здесь:

#include <iostream>

auto func()
{
    class // no name
    {
      public:
             int val;
    } a;

    a.val = 5;

    return a;
}

int main()
{
    std::cout << func().val << std::endl;
    return 0;
}

Итак, Является ли он действительным в С++?

Также мне интересно узнать, Можно ли использовать анонимные классы в С++?

Ответ 1

В С++ анонимный союз является объединением этой формы:

 union { ... } ;

Он определяет неназванный объект неназванного типа. Его члены вводятся в окружение, поэтому можно ссылаться на них, не используя префикс <object>., который в противном случае был бы необходим.

В этом смысле не существует анонимных классов (которые не являются союзами --- в союзах С++ являются классами).

С другой стороны, неназванные классы (включая структуры и объединения) не являются чем-то необычным.

union { ... } x;
class { ... } y;
typedef struct { ... } z;

x и y называются объектами неназванных типов. z - это typedef-имя, которое является псевдонимом для неназванной структуры. Они не называются анонимными, потому что этот термин зарезервирован для указанной выше формы объединения.

[](){}

Lambdas - это неназванные объекты неназванных типов классов, но они также не называются анонимными.

Ответ 2

Кроме того, вы можете создавать дополнительные экземпляры класса с помощью decltype.

#include <iostream>

class 
{
   public:
      int val;
} a;


int main()
{
   decltype(a) b;
   a.val = 10;
   b.val = 20;

   std::cout << a.val << std::endl;
   std::cout << b.val << std::endl;
   return 0;
}

Вывод:

10
20

Ответ 3

Всегда можно было написать что-то вроде этого:

typedef struct { int a; } type;

Теперь, если вы посмотрите на часть struct { int a }, это анонимная структура. В С++ в принципе нет разницы между структурами и классами (кроме модификаторов доступа по умолчанию). Таким образом, возможно иметь анонимные структуры/классы.