【问题标题】:Does the order of C++ struct fields matter in aggregate initializationC++ 结构字段的顺序在聚合初始化中是否重要
【发布时间】:2013-08-23 16:53:11
【问题描述】:

下面的代码是产生已定义的行为还是未定义的行为。我在我的 VC++ 上尝试过,我得到了一件事,但我很想知道这是否只是巧合,还是 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;
}

【问题讨论】:

  • 这不只是 POD 初始化(有一个奇怪的 char(412))吗!?
  • @DieterLücking:这个术语是 aggregate-initialization 但是是的,这是大多数人在 C++03 中理解为 POD-initialization 的意思.在 C++11 中,情况发生了变化,POD 与以前完全不同(所有 C++03 POD 类型都是 C++11 POD 类型,但有一些 C++11 POD 类型不是有效的 C ++03 POD 类型[成员可以是私有的],对于那些你不能使用 aggregate-initialization)

标签: c++ visual-c++ c++11


【解决方案1】:

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

字段的顺序很重要。对于聚合初始化,每个值将按声明顺序初始化下一个成员,因此在上面的代码中,testChar 将获得值 static_cast&lt;char&gt;(412.1)testDouble 将获得值 52testInt 将获得值 @987654327 @(标准保证所有没有提供值的成员都会被初始化为0。

【讨论】:

  • 并且 gcc 为 OP 代码发出了几个警告(从 double 到 char 的窄转换)
  • 是否也定义了static_cast&lt;char&gt;(412.1)?特别是CHAR_MAX &lt; 412时定义的?
  • @MSalters 是的,它总是被定义,但并不总是相同:stackoverflow.com/a/6752688/256138
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2019-12-11
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多