gpt4 book ai didi

c++ - 是否可以默认初始化一个临时变量?

转载 作者:行者123 更新时间:2023-12-01 15:10:21 25 4
gpt4 key购买 nike

考虑以下代码:

struct S { int m; };

S trick() { S s; return s; }

void bar(S s) { /* observe s.m */ }

void foo()
{
S s; // s.m is indeterminate
S* p = new S; // p->m is indeterminate
bar(S()); // bar() will observe S::m to be 0
bar(trick()); // bar() will observe S::m to be indeterminate
}
是否可以构造S类型的临时变量而无需借助技巧?
我为什么需要这个?
据我了解,“默认初始化”从概念上讲是构造对象的最便宜的方法。以这种方式构造临时文件的能力对于以尽可能少的开销忽略不需要的数据很有用:
struct S { int m; };

void foo(S* pOut); // 3rd party function that insists on returning some data

template<class T> T* tmp_addr(T&& v) { return &v; } // careful with this one...

foo( tmp_addr(trick()) ); // receive and discard data without zeroing out memory

最佳答案

您可以默认初始化临时变量的子对象。

template<typename T>
class default_init_tmp final {
T t;
public:
default_init_tmp () /*Intentionally left blank*/ {}
default_init_tmp (default_init_tmp const&) = delete;
void operator=(default_init_tmp const&) = delete;
T* operator&() { return &t; }
};
当然,通常不建议重载 operator&,但考虑到该练习的一般性质,在某种程度上似乎合适。您将按以下方式使用它
int main() 
{
foo(&default_init_tmp<S>());
}

关于c++ - 是否可以默认初始化一个临时变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63034920/

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