【发布时间】:2017-03-08 08:16:44
【问题描述】:
如果我有一个结构
SomeStruct
{
double y;
double x;
};
我在某处初始化它
SomeStruct s{1,2}; //y=1 x=2
如果我将结构重新排序为
,我的代码似乎可以静默地中断SomeStruct
{
double x;
double y;
double z;
};
从现在开始SomeStruct s{1,2} 表示 x=1, y=2, z=0
编辑: 提出的一个论点是构造函数也有同样的问题,这是正确的,但您通常可以在那里看到参数名称和顺序 - 如果使用任何现代 IDE 则更清楚。
我从未见过有人提到过这一点,但似乎只有在确定永远不会更改数据布局的情况下才能安全地使用这样的聚合初始化。那将是罕见的情况,那么有没有“永远不要在非同构结构上使用聚合初始化”的潜规则?
【问题讨论】:
-
构造函数确实有同样的问题。这更多的是类型问题而不是初始化问题。
-
但是如果你在你的构造函数中添加一个新对象,如果新的对象丢失,代码将无法编译。在问题中,代码会编译,没有人会意识到可能有错误。
-
@Ventu:好的,没错,但是如果你重新排序相同类型的字段,或者重新排序构造函数参数,你仍然可以引入静默更改。
-
@Kerrek SB 也对。
标签: c++ struct refactoring type-safety aggregate-initialization