2012-07-17 63 views
8

我是C++新手。我經常從一些網站上閱讀變體成員?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. 
+6

你能發佈一個鏈接到這些網站嗎? – Praetorian 2012-07-17 15:38:32

+0

堆棧溢出本身就是其中之一。 – BlackVegetable 2012-07-17 15:40:11

+0

你是在說'boost :: variant'還是其他的東西?傳統上,變體是包含所有支持類型的聯合。 – chris 2012-07-17 15:43:12

回答

11

「變體構件」在C++ 11 9.5/8定義:

甲工會狀類是聯合或具有匿名聯合 作爲直接成員的類。類工會類X具有一組變體成員。 如果X是聯合,它的變體成員是非靜態數據成員; 否則,它的變種成員都是 匿名聯合是十

的成員。換句話說,所有工會的非靜態數據成員是「變種成員」的非靜態數據成員,對於包含任何匿名聯合的類,其非靜態數據成員是該類的「變體成員」。

你引用的上下文是12.1/5,說如果類似聯合的類有一個具有非平凡默認構造函數的變體成員,那麼該類本身的默認構造函數將被刪除。問題是其中變體成員應該由該類的默認構造函數構造,並且該解決方案不具有默認構造函數。如果所有變體成員都有簡單的默認構造函數,則沒有問題,因爲無所事事,該類的默認構造方法是均等地構造所有/不是它們。

boost::variant是一件單獨的事情。如果「某些站點」在他們的意思是「給定的boost::variant可以容納的可能類型」,也就是說variant的「成員」時,我不會感到驚訝。但這不是C++ 11標準中新定義的含義。

+0

Steve,謝謝你的回覆。試圖從您的評論中獲得更多的清晰度。所以要說union {int x; int y},在這裏,x,y都是變體成員。我對麼? – Whoami 2012-07-17 16:36:24

+0

@Whoami:沒錯。 – 2012-07-18 08:03:36

7

術語變體通常使用,以確定可容納一組不同類型的的值的構件。與該語言中的union類似,術語variant通常保留爲允許以類型安全的方式存儲不同選項的類型。

您可能需要閱讀boost變體庫的文檔以查看其中的一個示例,如果這樣做不能清除該概念,請刪除評論/用疑問創建一個問題。

Boost Variant

2

變體是含有聯合成員和一個無符號整數構件描述當前正在使用了將聯的構件的結構。如果你不知道什麼是工會,請先閱讀它,然後再回來。

相關問題