POD struct
可以在C++ 11中进行零初始化,如下所示:
SomeStruct s{};
但是,如果我已经有一个struct的实例并且我想将它重新初始化为零,我该怎么办?以下似乎有效:
s = {};
有人能指出相关的标准吗?我假设这是发生的事情:
创建一个新的零初始化实例.
新实例将分配给现有实例,从而调用隐式赋值运算符.
NathanOliver.. 20
您正在寻找的是[expr.ass]
一个支撑-初始化列表上可能出现的右侧
标量的赋值,在这种情况下,初始化列表最多只能包含一个元素.
x={v}
其中T是表达式x的标量类型的含义是x=T{v}
.意思x={}
是x=T{}
.对类类型的对象的赋值,在这种情况下,初始化列表作为参数传递给由重载决策(13.5.3,13.3)选择的赋值运算符函数.
所以你的猜测是正确的.编译器可能能够优化掉事物,但您可以将其视为创建零初始化临时值并将其传递给operator=
.
您正在寻找的是[expr.ass]
一个支撑-初始化列表上可能出现的右侧
标量的赋值,在这种情况下,初始化列表最多只能包含一个元素.
x={v}
其中T是表达式x的标量类型的含义是x=T{v}
.意思x={}
是x=T{}
.对类类型的对象的赋值,在这种情况下,初始化列表作为参数传递给由重载决策(13.5.3,13.3)选择的赋值运算符函数.
所以你的猜测是正确的.编译器可能能够优化掉事物,但您可以将其视为创建零初始化临时值并将其传递给operator=
.
s = {};
不安全
问题是你希望它变成了s = SomeStruct{};
.但是,如果s
有另一个过载,operator=
则可能是重载决策的首选.
所以这是一种反模式,真的.正如在另一个线程上所建议的那样,你最好写一个函数,例如:
templatevoid reset(T &t) { t = T{}; }
我想你也可以写s = decltype(s){};
,只要s
不是参考.