C++ 中真的有 Anonymous class/struct 吗?
Is there really an Anonymous class/struct in C++?
我对许多网站感到困惑:那里的人将 class/struct
没有名字的人称为匿名,例如:
struct{
int x = 0;
}a;
我认为上面的例子创建了一个未命名的 struct
但不是匿名的 struct
。我认为匿名 struct/class
在结束 class 主体的大括号之后和结束 class 定义的分号之前没有名称或声明符:
class { // Anonymous class
int x_ = 0;
}; // no delcarator here
当然,标准会拒绝上述声明,因为它的格式不正确。
union
s 可以是未命名或匿名的:
union{
char unsigned red_;
char unsigned green_;
char unsigned blue_;
long unsigned color_ = 255;
} color;
在上面的这个例子中,我声明了一个未命名的(但不是匿名的)联合,这类似于上面的 class/structs。
一个union
可以匿名:
// 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
上面我已经声明了一个匿名 union
并且代码工作正常。原因是编译器会自动合成一个匿名联合的对象,我们可以直接访问它的成员。 (虽然有一些限制)。
我认为编译器不允许匿名 class/struct 因为它不会自动创建该类型的对象。
那么我的想法对吗?如果没有,请指导我。谢谢!
在 C++ 标准 (N4659) 的术语中,只有联合可以是“匿名的”。短语“anonymous class”和“anonymous struct”都没有出现在标准中的任何地方。事实上,“匿名”一词本身在标准中只出现了 44 次:42 次后跟“联合”一词,在索引的“联合”子列表下单独出现了两次。
我对许多网站感到困惑:那里的人将 class/struct
没有名字的人称为匿名,例如:
struct{
int x = 0;
}a;
我认为上面的例子创建了一个未命名的 struct
但不是匿名的 struct
。我认为匿名 struct/class
在结束 class 主体的大括号之后和结束 class 定义的分号之前没有名称或声明符:
class { // Anonymous class
int x_ = 0;
}; // no delcarator here
当然,标准会拒绝上述声明,因为它的格式不正确。
union
s 可以是未命名或匿名的:union{ char unsigned red_; char unsigned green_; char unsigned blue_; long unsigned color_ = 255; } color;
在上面的这个例子中,我声明了一个未命名的(但不是匿名的)联合,这类似于上面的 class/structs。
一个
union
可以匿名:// 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
上面我已经声明了一个匿名
union
并且代码工作正常。原因是编译器会自动合成一个匿名联合的对象,我们可以直接访问它的成员。 (虽然有一些限制)。我认为编译器不允许匿名 class/struct 因为它不会自动创建该类型的对象。
那么我的想法对吗?如果没有,请指导我。谢谢!
在 C++ 标准 (N4659) 的术语中,只有联合可以是“匿名的”。短语“anonymous class”和“anonymous struct”都没有出现在标准中的任何地方。事实上,“匿名”一词本身在标准中只出现了 44 次:42 次后跟“联合”一词,在索引的“联合”子列表下单独出现了两次。