下面的代码是安全的,只要我没有读取结构数组的任何元素而不先设置实数值吗?谢谢.
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;
}
Run Code Online (Sandbox Code Playgroud)
std::copy定义为*(result + n) = *(first + n)序列中的每个元素(第25.3.1节).给定的值*(first + n)是左值表达式(§5.3.1/ 1),在您的情况下引用未初始化的值.由于赋值运算符需要prvalue作为右操作数(这是错误指定的),这将导致左值到右值的转换.在引用未初始化值的表达式上的左值到右值转换是未定义的行为(第4.1节):
如果以该glvalue是指该对象不是类型T的对象,而不是源自T的类型的对象,如果该对象是未初始化,即必要这种转换的程序有未定义的行为.
所以你的代码有不确定的行为.解决方案当然是初始化数组的元素(也许是int data[data_size] = {};).