6

次のコードは、最初に実際の値を設定せずに構造体の配列の要素を読み取らない限り、安全ですか?ありがとう。

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;
}
4

1 に答える 1

9

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

于 2013-03-05T18:49:14.840 に答える