4
#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
}

是否可以将类型的右值传递Afoo()而不对其进行值初始化?我们必须使用值初始化还是左值?

你可能会问,当它“花费”不超过 10 纳秒时,避免值初始化有什么意义。像这样的情况怎么样:我们正在寻找遗留应用程序中由 valgrind 未初始化的内存访问引起的错误,并且零不被视为应用程序的有效值。值初始化将阻止 valgrind 发现未初始化内存访问的位置。

您可能会说打印未初始化的值是 UB,但我的“真实”用例并不限于打印。没有它,我的问题应该仍然有效。

4

1 回答 1

1

如果我正确理解了这个问题,您需要替换foo(A());或类似的情况,A()这样您就没有默认的成员初始化。

在那种情况下,我想出了一个:

  • 首先我尝试添加A() = default(但这可能不适用于较旧的 c++ 标准)并且我得到了有趣的结果。您提供的确切样本首先反向打印 0,然后是一些随机数。

  • 其次,我没有使用A() = default;,只是使用了模板函数

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

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

于 2016-10-12T09:52:33.670 回答