如果未初始化的数据未被使用/稍后设置,是否可以复制?

时间:2013-03-05 18:38:10

标签: c++

以下代码是否安全,只要我没有读取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;
}

1 个答案:

答案 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] = {};)。