c – 获取默认初始化(NOT值/零初始化)POD作为右值

#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然后是一些随机数.
>其次我没有使用A()=认值;并且只使用了模板化的功能

template <class T> T make() { T tmp; return tmp; }

以复制(或移动)为代价,您可以像foo(make< A>())一样使用它并获得您想要的结果.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...