是否可以在C++中使用匿名类?

msc*_*msc 24 c++ g++ class c++11 c++14

我已经看到匿名类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;
}
Run Code Online (Sandbox Code Playgroud)

那么,它在C++中是否有效?

另外,我很想知道,是否可以在C++中使用匿名类?

R S*_*ahu 32

不仅如此,您还可以使用创建更多类的实例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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

10
20
Run Code Online (Sandbox Code Playgroud)

  • @lisyarus:有可能使用像`template <typename T> T create(const T&prototype){return T(); }` (4认同)

n. *_* m. 19

在C++中,匿名联合是这种形式的联合:

 union { ... } ;
Run Code Online (Sandbox Code Playgroud)

它定义了一个未命名类型的未命名对象.它的成员被注入到周围的范围中,因此可以在不使用<object>.其他必要的前缀的情况下引用它们.

从这个意义上讲,不存在匿名类(不是工会---在C++联合中是类).

另一方面,未命名的类(包括结构和联合)并不罕见.

union { ... } x;
class { ... } y;
typedef struct { ... } z;
Run Code Online (Sandbox Code Playgroud)

x并且y是未命名类型的命名对象.z是一个typedef-name,它是未命名结构的别名.它们不是匿名的,因为这个术语是为上述形式的联合保留的.

[](){}
Run Code Online (Sandbox Code Playgroud)

Lambdas是未命名类类型的未命名对象,但它们也不称为匿名.

  • @DonaldDuck不,它们可以转换为std :: function,但每个lambda都有自己独特的类型. (3认同)

nak*_*iya 10

总是可以这样写:

typedef struct { int a; } type;
Run Code Online (Sandbox Code Playgroud)

现在,如果你看一下struct { int a },这是一个匿名结构.在C++中,结构和类之间基本没有区别(默认访问修饰符除外).因此,可以使用匿名结构/类.