gpt4 book ai didi

c++ - 使用未初始化的成员复制结构

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

复制一个未初始化其成员的结构是否有效?

我怀疑这是未定义的行为,但如果是这样,则会使任何未初始化的成员保留在结构中(即使从未直接使用这些成员)也很危险。所以我想知道标准中是否有允许它的东西。

例如,这有效吗?

struct Data {
int a, b;
};

int main() {
Data data;
data.a = 5;
Data data2 = data;
}

最佳答案

是的,如果未初始化的成员不是未签名的窄字符类型或std::byte,那么使用隐式定义的副本构造函数复制包含该不确定值的结构在技术上是未定义的行为,因为它是用于复制具有相同类型的不确定值的变量,由于[dcl.init]/12

这适用于这里,因为除union之外,隐式生成的副本构造函数被定义为单独复制每个成员,就像通过直接初始化一样,请参见[class.copy.ctor]/4

这也是active CWG issue 2264的主题。

我想实际上您对此不会有任何问题。

如果您想100%确定,则类型为trivially copyablestd::memcpy始终具有明确定义的行为,即使成员的值不确定。

除了这些问题,假设您不要求该类具有trivial default constructor,则无论如何都要在构造时始终使用指定的值正确初始化类成员。您可以使用默认的成员初始化器语法例如值初始化成员:

struct Data {
int a{}, b{};
};

int main() {
Data data;
data.a = 5;
Data data2 = data;
}

关于c++ - 使用未初始化的成员复制结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60112841/

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