c – 获取默认初始化(NOT值/零初始化)POD作为右值
发布时间:2020-12-16 07:17:39 所属栏目:百科 来源:网络整理
导读:#include iostreamstruct A { int x;};void foo(A a) { std::cout a.x std::endl;}int main() { A a; foo(a); // -7159156; a was default-initialized foo(A()); // 0; a was value-initialized} 是否可以将类型A的右值传递给foo()而不进行值初始化?我们必
#include <iostream> struct A { int x; }; void foo(A a) { std::cout << a.x << std::endl; } int main() { A a; foo(a); // -7159156; a was default-initialized foo(A()); // 0; a was value-initialized } 是否可以将类型A的右值传递给foo()而不进行值初始化?我们必须使用值初始化还是左值? 你可能会问,当“成本”不超过10纳秒时,避免价值初始化的重点是什么.这样的情况怎么样:我们正在寻找遗留应用程序中由于使用valgrind进行未初始化的内存访问而导致的错误,并且零不被视为应用程序的有效值.值初始化将阻止valgrind发现未初始化的内存访问的位置. 您可能会说打印未初始化的值是UB,但我的“真实”用例不仅限于打印.没有它,我的问题应该仍然有效. 解决方法
如果我正确理解了这个问题,你需要替换foo(A());或类似的情况,其中调用A(),以便您没有成员的默认初始化.
在这种情况下,我想出的是: >首先我尝试添加A()=默认值(但这可能不适用于较旧的c标准)并且我有interesting results.您提供的确切样本在反向打印中首先使用0然后是一些随机数. template <class T> T make() { T tmp; return tmp; } 以复制(或移动)为代价,您可以像foo(make< A>())一样使用它并获得您想要的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |