2012-11-25 94 views
1

考慮下面的代碼:構造結構與私人會員

class A 
{ 
private: 
    struct B { private: int i; friend class A; }; 

public: 
    static void foo1() 
    { 
     B b; 
     b.i = 0; 
    } 

    static void foo2() 
    { 
     B b = {0}; 
    } 
}; 

爲什麼foo1工作,但不foo2的? A類不是結構體初始化構造函數嗎?無論如何要在C++ 11中完成這項工作嗎?

(注意,刪除私人品牌foo2的工作。)

回答

3

爲什麼foo1工作,但不是foo2?類A不是結構體初始化構造函數嗎?

B b = {0}; 

不起作用,因爲B不是聚合。它不是一個聚合,因爲它有一個非靜態的私有數據成員。如果您刪除私人說明符,B將成爲一個聚合,因此可以用這種方式進行初始化。


C++ 03標準8.5.1骨料
帕拉7:

如果在列表中更少的初始化值多於在聚集構件,則每個部件未明確初始化的應該進行值初始化(8.5)。 [實施例:

struct S { int a; char* b; int c; }; 
S ss = { 1, "asdf" }; 

初始化ss.a1ss.b"asdf",和ss.c與表單int()的表達式的值,即,0。 ]

C++ 03標準8.5.1§1

聚集是沒有用戶聲明的 構造(12.1),陣列或類(第9節)沒有私有或受保護的非靜態數據成員(第11章), 沒有基類(第10節),也沒有虛函數(10.3)。