#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,但我的“真实”用例不仅限于打印。没有它,我的问题应该仍然有效。
答案 0 :(得分:1)
如果我正确理解了这个问题,您需要替换foo(A());
或类似的情况,其中A()
被调用,以便您没有成员的默认初始化。
在这种情况下,我想出的就是:
首先我尝试添加A() = default
(但这可能不适用于较旧的c ++标准),我有interesting results。您提供的确切样本首先在反向打印0,然后是一些随机数。
其次我没有使用A() = default;
而只使用模板化函数
template <class T> T make() { T tmp; return tmp; }
以复制(或移动)为代价,您可以像foo(make<A>())
一样使用它,并获得您想要的结果。