【发布时间】:2015-11-05 06:34:59
【问题描述】:
我继承了一个 C++98 代码库,它在 C++ 类上有两个主要用途 memset(),为了清晰起见扩展了宏:
// pattern #1:
Obj o;
memset(&o, 0, sizeof(o));
// pattern #2:
// (elsewhere: Obj *o;)
memset(something->o, 0, sizeof(*something->o));
您可能已经猜到,此代码库不使用 STL 或其他非 POD 类。当我尝试将一个 std::string 放入其中一个类时,通常会发生不好的事情。
据我了解,这些模式可以在 C++11 中重写如下:
// pattern #1
Obj o = {};
// pattern #2
something->o = {};
也就是说,在这两种情况下,{} 的赋值都会用默认初始化值重写对象的内容。漂亮又干净,不是吗?
嗯,是的,但它不起作用。它适用于 *nix 系统,但在使用带有 v120_xp 工具集的 VS2013 构建时会产生相当莫名其妙的结果(本质上是垃圾值),这意味着我对初始化列表的理解有些欠缺。
所以,问题:
- 为什么这不起作用?
- 有什么更好的方法来替换 memset 的这种使用,以确保具有构造函数的成员被正确地默认初始化,并且最好可以可靠地应用,只需搜索和替换(遗憾的是没有测试)。如果它适用于 VS2013 之前的版本,则可以加分。
【问题讨论】:
-
是的,空大括号初始化器的工作效果不如人们想象的那么好,我遇到了许多关于成员没有完全归零的错误。不幸的是,我认为一般初始化 C++ 类的成员没有任何快速解决方法......我的理解是您必须显式初始化成员
-
Obj o = {};工作了吗? -
另外你确定你的班级是一个聚合班吗?见stackoverflow.com/questions/4178175/…
-
@personjerry Ahhh,有些类有基类——尽管甚至不是为了继承,只是为了在将代码构建为库时隐藏一些数据——事实上,其中一个已被填充在 MSVC 上有垃圾值!谢谢你的链接。