2013-08-22 29 views
1

以下代碼是否會產生已定義的行爲或未定義的行爲。我在我的VC++上試了一下,我得到了一件事,但我很好奇,看看這是否只是coincendence,或者它是由C++標準強制的。在聚合初始化中,C++結構字段的順序是否重要

#include <iostream> 
class TestClass { 
public: 
    char testChar; 
    double testDouble; 
    int testInt; 
}; 

int main(int argc, char** argv) { 
    TestClass s = {412.1, 52}; 
    std::cout << s.testChar + s.testDouble + s.testInt << std::endl; 
} 
+0

是不是隻是POD初始化(有一個奇怪的字符(412))!?? –

+0

@DieterLücking:術語是*聚合初始化*但是,這是大多數人會理解爲C++ 03中的* POD-initialization *在C++ 11中,事物的變化和POD與以前完全不同(所有的C++ 03 POD類型都是C++ 11 POD類型,但在那裏是一些C++ 11 POD類型,它們是無效的C++ 03 POD類型[成員可以是私有的],fo r那些你不能使用* aggregate-initialization *) –

回答

8

該行爲已定義,但結果可能不符合您的預期。

這些字段的順序很重要。對於集合初始化,每個值將按照聲明的順序初始化下一個成員,因此在上面的代碼中,testChar將獲得值static_cast<char>(412.1),testDouble將獲得值52testInt將獲得值0(該標準保證所有沒有值的成員是提供將被初始化爲0.

+0

和gcc對OP代碼發出幾個警告(從double到char的轉換範圍很窄) – Jarod42

+0

static_cast (412.1)'也被定義了嗎?特別是,當CHAR_MAX <412'時它被定義了嗎? – MSalters

+0

@ MSalters是的,它總是被定義的,雖然不總是相同的:http://stackoverflow.com/a/6752688/256138 – rubenvb