以下代码是否安全,只要我没有读取struct数组的任何元素而不先设置实数值?感谢。
const int data_size = 5;
struct Testing
{
int data[data_size];
Testing(const int data[data_size])
{
std::copy(data, data + data_size, this->data);
}
};
int main()
{
int data[data_size];
data[2] = 57;
Testing t(data);
t.data[1] = 93;
}
答案 0 :(得分:9)
std::copy
被定义为对序列中的每个元素执行*(result + n) = *(first + n)
(第25.3.1节)。 *(first + n)
给出的值是左值表达式(§5.3.1/ 1),在您的情况下引用未初始化的值。由于赋值运算符需要prvalue作为右操作数(这是ill-specified),这将导致左值到右值的转换。引用未初始化值的表达式的左值到右值转换是未定义的行为(第4.1节):
如果glvalue引用的对象不是T类型的对象,并且不是从T派生的类型的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为。
所以你的代码有不确定的行为。解决方案当然是初始化数组的元素(可能使用int data[data_size] = {};
)。