C++ C++;结构字段在聚合初始化中很重要

C++ C++;结构字段在聚合初始化中很重要,c++,visual-c++,c++11,C++,Visual C++,C++11,以下代码是生成已定义行为还是未定义行为。我尝试了我的VC++,我有一件事,但我很好奇,看看这是恰好或如果它是由C++标准授权。< /P> #include <iostream> class TestClass { public: char testChar; double testDouble; int testInt; }; int main(int argc, char** argv) { TestClass s = {412.1, 52};

以下代码是生成已定义行为还是未定义行为。我尝试了我的VC++,我有一件事,但我很好奇,看看这是恰好或如果它是由C++标准授权。< /P>
#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;
}
#包括
类TestClass{
公众:
字符testChar;
双测试双;
智力测验;
};
int main(int argc,字符**argv){
TestClass s={412.1,52};

std::cout行为已定义,但结果可能不是您所期望的


字段的顺序很重要。对于聚合初始化,每个值将按照声明的顺序初始化下一个成员,因此在上面的代码中,
testChar
将获得值
static\u cast(412.1)
testDouble
将获得值
52
testInt
将获得值
0
(该标准保证所有未提供值的成员将被初始化为0。

行为已定义,但结果可能不是您所期望的


字段的顺序很重要。对于聚合初始化,每个值将按照声明的顺序初始化下一个成员,因此在上面的代码中,
testChar
将获得值
static\u cast(412.1)
testDouble
将获得值
52
testInt
将获得值
0
(该标准保证所有未提供值的成员都将被初始化为0。

这不只是POD初始化(具有奇怪的字符(412))!?@DieterLücking:术语是聚合初始化,但是的,这是大多数人在C++03中理解为POD初始化。在C++11中,情况发生了变化,POD与以前完全不同(所有C++03 POD类型都是C++11 POD类型,但有些C++11 POD类型不是有效的C++03 POD类型)[成员可以是私有的],对于那些不能使用聚合初始化的成员来说)这不只是POD初始化(有一个奇怪的字符(412))!?@DieterLücking:术语是聚合初始化,但是的,这是大多数人在C++03中理解为POD初始化。在C++11中,情况发生了变化,POD与以前完全不同(所有C++03 POD类型都是C++11 POD类型,但有些C++11 POD类型不是有效的C++03 POD类型)[成员可以是私有的],对于那些不能使用聚合初始化的成员)和gcc会针对操作代码(从double到char的狭义转换)发出若干警告,即
static_cast(412.1)
也定义了吗?特别是,它是在
字符最大值<412
时定义的吗?@MSalters是的,它总是被定义的,尽管不总是相同的:并且gcc发出几个警告,提示OP代码(从双精度到字符的窄转换)是
静态的(412.1)
也定义了吗?特别是当
CHAR\u MAX<412
时是否定义了它?@MSalters是的,它总是定义的,尽管不总是相同的: