我是C ++的新手。我从一些变异成员的网站上经常阅读?
class School
{
int x; -> data member.
}
我知道数据成员。但什么是变体成员?
注意: 从c ++规范:在Constructor页面下。
X is a union-like class that has a variant member with a non-trivial default constructor.
答案 0 :(得分:13)
“变体成员”在C ++ 11的9.5 / 8中定义:
类似联合的类是具有匿名联合的联合或类 作为直接会员。类似联合的类X具有一组变体成员。 如果X是联合,则其变体成员是非静态数据成员; 否则,其变体成员是所有的非静态数据成员 作为X成员的匿名工会。
换句话说,union的所有非静态数据成员都是“变体成员”,对于包含任何匿名联合的类,它们的非静态数据成员是该类的“变体成员”。
您引用的上下文是12.1 / 5,表示如果类似联合的类具有带有非平凡构造函数的变体成员,则会删除该类本身的默认构造函数。问题是哪个变体成员应该由类的默认构造函数构造,并且解决方案不是具有默认构造函数。如果所有变体成员都有普通的默认构造函数,那就没有问题了,因为通过什么都不做,类的默认构造函数就是同等地构造所有/没有构造函数。
boost::variant
是另一回事。如果“某些网站”说“变体成员”,当他们的意思是“给定boost::variant
可以容纳的可能类型”时,我就不会感到惊讶,也就是说{{1}的“成员” }。但这不是C ++ 11标准中新定义的含义。
答案 1 :(得分:7)
术语变体通常用于标识可以保存一组不同类型的值的成员。与语言中的union
类似,术语variant
通常保留用于允许以类型安全方式存储不同选项的类型。
您可能希望阅读一个此类示例的boost变体库的文档,如果这不清除概念,请删除注释/创建疑问。
答案 2 :(得分:2)
变量是一个包含union成员和无符号整数成员的结构,该成员描述当前正在使用的union的哪个成员。如果您不知道联盟是什么,请先阅读它,然后再回来。