当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在C++中零重新初始化结构》经验,为你挑选了2个好方法。

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=.



1> NathanOliver..:

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

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

标量的赋值,在这种情况下,初始化列表最多只能包含一个元素.x={v}其中T是表达式x的标量类型的含义是x=T{v}.意思 x={}x=T{}.

对类类型的对象的赋值,在这种情况下,初始化列表作为参数传递给由重载决策(13.5.3,13.3)选择的赋值运算符函数.

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



2> M.M..:

s = {}; 不安全

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

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

template void reset(T &t) { t = T{}; }

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


为什么不明确地使用你的`hope`来解析.`s = SomeStruct {}`?这似乎比调用`reset()`的函数更清晰.
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有