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

Tri*_*ock 22 c++ struct language-lawyer c++11

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

SomeStruct s{};
Run Code Online (Sandbox Code Playgroud)

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

s = {};
Run Code Online (Sandbox Code Playgroud)

有人能指出相关的标准吗?我假设这是发生的事情:

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

Nat*_*ica 20

您正在寻找的是[expr.ass]

一个支撑-初始化列表上可能出现的右侧

  • 标量的赋值,在这种情况下,初始化列表最多只能包含一个元素.x={v}其中T是表达式x的标量类型的含义是x=T{v}.意思 x={}x=T{}.
  • 对类类型的对象的赋值,在这种情况下,初始化列表作为参数传递给由重载决策(13.5.3,13.3)选择的赋值运算符函数.

所以你的猜测是正确的.编译器可能能够优化掉事物,但您可以将其视为创建零初始化临时值并将其传递给operator=.


M.M*_*M.M 14

s = {}; 不安全

问题是你希望它变成了s = SomeStruct{};.但是,如果s有另一个过载,operator= 则可能是重载决策的首选.

所以这是一种反模式,真的.正如在另一个线程上所建议的那样,你最好写一个函数,例如:

template<typename T> void reset(T &t) { t = T{}; }
Run Code Online (Sandbox Code Playgroud)

我想你也可以写s = decltype(s){};,只要s不是参考.

  • 为什么不明确地使用你的`hope`来解析.`s = SomeStruct {}`?这似乎比调用`reset()`的函数更清晰. (2认同)