Можно ли использовать анонимные классы в С++?
Я видел анонимные классы в 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 }
, это анонимная структура. В С++ в принципе нет разницы между структурами и классами (кроме модификаторов доступа по умолчанию). Таким образом, возможно иметь анонимные структуры/классы.