POD struct
可以在C ++ 11中进行零初始化,如下所示:
SomeStruct s{};
但是,如果我已经有一个struct的实例并且我想将它重新初始化为零,我该怎么办?以下似乎有效:
s = {};
有人可以指出相关的标准吗?我认为这就是发生的事情:
答案 0 :(得分:20)
您正在寻找的是[expr.ass]
braced-init-list 可能会出现在
的右侧
- 对标量的赋值,在这种情况下,初始化列表最多只能包含一个元素。该
x={v}
的含义,其中T是表达式x的标量类型,是x=T{v}
的含义。的含义x={}
是x=T{}
。- 对类类型对象的赋值,在这种情况下,初始化列表作为参数传递给 由重载决策(13.5.3,13.3)选择的赋值运算符函数。
所以你的猜测是正确的。编译器可能能够优化掉事物,但您可以将其视为创建零初始化临时值并将其传递给operator=
。
答案 1 :(得分:14)
s = {};
不安全。
问题是你希望变成s = SomeStruct{};
。但是,如果s
还有operator=
then that may be preferred by overload resolution的其他重载。
所以这是一种反模式,真的。正如另一个帖子所建议的那样,你最好写一个函数,例如:
template<typename T> void reset(T &t) { t = T{}; }
我想你也可以写s = decltype(s){};
,只要s
不是参考。