将 slice_array 分配给另一个 slice_array 是不是正确?

Posted

技术标签:

【中文标题】将 slice_array 分配给另一个 slice_array 是不是正确?【英文标题】:Is it correct to assign a slice_array to another slice_array?将 slice_array 分配给另一个 slice_array 是否正确? 【发布时间】:2020-09-10 21:51:30 【问题描述】:
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++ 库的错误吗?

【问题讨论】:

【参考方案1】:

是的,您可以使用operator= 将一个std::slice_array 分配给另一个

将 sl_arr 中的选定元素分配给 *this 的引用元素。

另外,这里没有bug,s1 = [0, 0, 2]的结果是正确的。

在你的情况下:

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

注意s2 引用的第一个元素是0,它被分配给s1 的第一个元素,这是test 的第二个元素。

然后这个新分配的值是s2 的第二个值,它被分配给s1 的第二个值,依此类推。

在作业结束时,test 变为

test  0, 0, 2, 0, 4, 2, 6, 7, 8, 9 

【讨论】:

感谢您的解释。但是如果我使用 GNU C++,我得到了不同的结果,在 s1=s2 之后,我得到了 s1: 0, 1, 2 而不是 0 0 2。我尝试了 clang++ 3.7 和 9.0,我也得到了 0,1,2。所以我我对不同的结果感到困惑。在这种情况下,是否有标准说明 0,0,2 是正确的还是 0,1,2 是正确的?谢谢! 请注意我从link下载了clang。谢谢。 @issac 从s1 的声明中删除const,您将得到0 0 2。我实际上根本不确定为什么它会与 const 一起编译。 非常感谢您指出,去掉 const,我得到了一致的结果。谢谢!

以上是关于将 slice_array 分配给另一个 slice_array 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

将结构成员指针分配给另一个动态内存分配的指针是不是安全?

将指针值分配给另一个指针值。我做错了吗?

将结构的第一个变量分配给另一个

如何比较 C++ slice_array?为啥不能将其与 valarray 进行比较?

将一个枚举类型分配给另一个枚举类型

ios 将 self 分配给另一个类中的属性