2014-03-27 79 views
2

成員初始值設定項中使用的sizeof的行爲是什麼?我無法找到關於這個的描述。在下面的代碼示例中它是安全的嗎?即struct會員編譯後會把A正確的大小寫入b成員初始值設定項中使用的sizeof的行爲是什麼?

struct A 
{ 
    int a = 0; 
    int b = sizeof(A); 
    int c = 3; 
    int d = 4; 
    char s[256]; 

    A() 
    { 
     //printf("b = %d\n", b); 
    } 
}; 
+1

應該正常工作。結構聲明不依賴於初始化器,所以在創建結構的時候sizeof將被填充,此時結構的大小已知。 –

+0

你應該嘗試一些更有趣的事情。添加地圖或其他東西。 –

+2

「添加地圖」有什麼不同?當涉及到'sizeof'時,'std :: map'具有固定的大小。它可能會有不同的動態大小,但這完全是無關緊要的。只要編譯器知道'class'或'struct'的定義,它就可以正常工作。任何其他類型的內容都不能包含未知大小的元素。這就是爲什麼你必須使用指針或引用尚未完全定義的對象。 –

回答

5

一個struct的大小在編譯比struct內的值的設置早得多確定。

+0

請注意,這是因爲非靜態成員的初始化實際上與您在構造函數的定義中獲得的範圍相同。如果代碼嘗試了'struct A {static constexpr int i = sizeof(A); };那麼它將無法工作,因爲該初始化器在不同的範圍內,並且類型在那裏不完整。 – bames53

相關問題