在C ++中零重新初始化结构

时间:2015-12-23 18:11:28

标签: c++ c++11 struct language-lawyer

POD struct可以在C ++ 11中进行零初始化,如下所示:

SomeStruct s{};

但是,如果我已经有一个struct的实例并且我想将它重新初始化为零,我该怎么办?以下似乎有效:

s = {};

有人可以指出相关的标准吗?我认为这就是发生的事情:

  1. 创建一个新的零初始化实例。
  2. 将新实例分配给现有实例,并调用隐式赋值运算符。

2 个答案:

答案 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不是参考。