Search code examples
c++anonymous-classanonymous-struct

Is there really an Anonymous class/struct in C++?


I'm confused by many websites: People there refer to a class/struct as Anonymous when it has no name for example:

struct{
   int x = 0;
}a;

I think the example above creates an Unnamed struct but not an Anonymous struct. I think an Anonymous struct/class doesn't have a name nor a declarator after the close-curly brace that ends the class body and before the semi-colon that ends the class definition:

class { // Anonymous class
   int x_ = 0;
}; // no delcarator here

And of course the standard refuses such declaration above because it is ill-formed.

  • unions can be Unnamed or Anonymous:

      union{
         char unsigned red_;
         char unsigned green_;
         char unsigned blue_;
         long unsigned color_ = 255;  
      } color;
    

In this example above I've declared an unnamed (but not an anonymous) union and this is similar to the class/structs above.

  • A union can be Anonymous:

      // cannot be declared in a namespace except adding `static` before the keyword `union` which makes the linkage of the unnamed object local to this TU
      /*static*/ union{ // Anonymous union
         char unsigned red_;
         char unsigned green_;
         char unsigned blue_;
         long unsigned color_ = 255; ;
      }; // no declarator
    
      green_ = 247; // ok accessing the member data green_ of the Anonymous union
    
  • Above I've declared an Anonymous union and the code works just fine. The reason is that the compiler will automatically synthesize an object of that Anonymous union and we can access its members directly. (although there are some restrictions).

  • I think the compiler disallows Anonymous class/struct because it doesn't automatically creates an object of that type.

So are my thoughts correct? if not please guide me. Thank you!


Solution

  • In the terminology of the C++ standard (N4659), only unions can be "anonymous". Neither the phrase "anonymous class" nor "anonymous struct" appear anywhere in the standard. In fact, the word "anonymous" itself appears only 44 times in the standard: 42 times followed by the word "union", and twice on its own underneath the "union" sublist of the Index.