13

私はC++を初めて使用します。私はその変種のメンバーであるいくつかのサイトから非常に頻繁に読んでいますか?

class School
{
  int x; -> data member. 
}

データメンバーを知っています。しかし、バリアントメンバーとは何ですか?

注:c ++仕様から:コンストラクターページの下。

X is a union-like class that has a variant member with a non-trivial default constructor.
4

3 に答える 3

14

「バリアントメンバー」は、C++11の9.5/8で定義されています。

ユニオンのようなクラスは、ユニオンまたは直接メンバーとして匿名のユニオンを持つクラスです。ユニオンのようなクラスXには、一連のバリアントメンバーがあります。Xがユニオンの場合、そのバリアントメンバーは非静的データメンバーです。それ以外の場合、そのバリアントメンバーは、Xのメンバーであるすべての匿名ユニオンの非静的データメンバーです。

つまり、ユニオンのすべての非静的データメンバーは「バリアントメンバー」であり、匿名ユニオンを含むクラスの場合、それらの非静的データメンバーはクラスの「バリアントメンバー」です。

引用したコンテキストは12.1/5であり、ユニオンのようなクラスに重要なデフォルトコンストラクターを持つバリアントメンバーがある場合、クラス自体のデフォルトコンストラクターが削除されることを示しています。問題は、クラスのデフォルトコンストラクターによってどのバリアントメンバーを構築する必要があるかであり、解決策はデフォルトコンストラクターを持たないことです。すべてのバリアントメンバーに些細なデフォルトコンストラクターがある場合、何もしないことでクラスのデフォルトコンストラクターがそれらのすべて/なしを等しく構築するため、問題はありません。

boost::variant別のものです。boost::variant「一部のサイト」が「特定のサイトが保持できる可能性のあるタイプ」、つまりその「メンバー」を意味するときに「バリアントメンバー」と言っても、それほど驚くことではありませんvariant。しかし、それはC++11標準で新しく定義された意味ではありません。

于 2012-07-17T15:51:29.700 に答える
7

バリアントという用語は通常、さまざまなタイプのセットの値を保持できるメンバーを識別するために使用されます。言語のaと同様にunion、この用語variantは通常、タイプセーフな方法でさまざまなオプションを格納できるタイプのために予約されています。

そのような例の1つとして、ブーストバリアントライブラリのドキュメントを読み、それでも概念が明確にならない場合は、コメントをドロップするか、疑問のある質問を作成してください。

ブーストバリアント

于 2012-07-17T15:44:02.197 に答える
2

バリアントは、ユニオンメンバーと、ユニオンのどのメンバーが現在使用されているかを説明する符号なし整数メンバーを含む構造体です。組合が何であるかわからない場合は、最初にそれについて読んでから、戻ってきてください。

于 2012-07-17T15:44:23.980 に答える