3
int input[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::valarray<int> test(input, sizeof(input)/sizeof(input[0]));

const std::slice_array<int> s1 = test[std::slice(1, 3, 2)];
const std::slice_array<int> s2 = test[std::slice(0, 3, 1)];

// is it correct to do this?
s1 = s2;

std::valarray<int> temp(s1);
printf("temp[0]=%d  temp[1]=%d temp[2]=%d\n", temp[0], temp[1], temp[2]);

コードを実行すると、次のようになりました。

test: 0 1 2 3 4 5 6 7 8 9 

s1:     1   3   5

s2:   0 1 2 

s1=s2

s1:     0   0   2     --> 0 1 2 is expected for s1

test: 0 0 2 0 4 5 6 7 8 9 

s1 = s2使用するのが正しいかどうか疑問に思っていますか?

使用するのが正しい場合、それは古いバージョンの LLVM C++ ライブラリのバグであると言っても過言ではありませんか?

4

1 に答える 1

2

はいstd::slice_arrayoperator=

sl_arr から選択された要素を、参照されている *this の要素に割り当てます。

また、ここにはバグはなく、 の結果s1 = [0, 0, 2]は正しいです。

あなたの場合:

test { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
s1        ^     ^     ^
s2     ^  ^  ^

によって参照される最初の要素は 0 であり、 の 2 番目の要素であるs2の 1 番目の要素に割り当てられることに注意してください。s1test

この新しく割り当てられた値は、 の 2 番目の値にs2割り当てられる の 2 番目の値であり、以下s1同様です。

test割り当ての終わりに、

test { 0, 0, 2, 0, 4, 2, 6, 7, 8, 9 }
于 2020-09-10T21:55:26.420 に答える