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)
有人能指出相关的标准吗?我假设这是发生的事情:
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
不是参考.
归档时间: |
|
查看次数: |
1006 次 |
最近记录: |