什么是c ++中的变体成员?

时间:2012-07-17 15:36:18

标签: c++ c++11

我是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.

3 个答案:

答案 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变体库的文档,如果这不清除概念,请删除注释/创建疑问。

Boost Variant

答案 2 :(得分:2)

变量是一个包含union成员和无符号整数成员的结构,该成员描述当前正在使用的union的哪个成员。如果您不知道联盟是什么,请先阅读它,然后再回来。