gpt4 book ai didi

c++ - 获取默认初始化(非值/零初始化)的 POD 作为右值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:13 25 4
gpt4 key购买 nike

#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() = default (但这可能不适用于旧的 c++ 标准)并且我有 interesting results .您提供的确切示例首先反向打印 0,然后打印一些随机数。

  • 其次我没有使用A() = default;并且只是使用了一个模板化函数

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

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

关于c++ - 获取默认初始化(非值/零初始化)的 POD 作为右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39993740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com