什么保证了slice_array类操作员的行为?

What guarantees behaviors of operators for slice_array class?

本文关键字:操作员 array slice 什么      更新时间:2023-10-16

<valarray>标头中,定义了五个类模板:valarrayslice_arraygslice_arraymask_arrayindirect_array

对于valarray<Type>对象,任何运算符都会影响所有元素。例如

int array1[] = {1,2,3};
int array2[] = {4,5,6};
valarray<int> v1(array1, 3);
valarray<int> v2(array2, 3);
valarray<int> v3 = v1 + v2; //v3 has 5, 7 and 9.

这就是一些用户使用valarray而不是其他容器(如vector)的原因,并且许多可靠的网站都描述了该运算符的行为。

顺便说一下,事实是,同样在<valarray>的 rest 类模板中,运算符是重载的。但是,我没有找到任何描述操作员行为的文档。至少在我的环境中,运算符的行为与类模板valarray相同,但我想获得一些书面证据。

在阅读标题<valarray>,找到一个句子#include <bits/slice_array.h>。在slice_array.h标题中,我找到了运算符的定义:

///  Assign slice elements to corresponding elements of @a v.
void operator=(const valarray<_Tp>&) const;
///  Multiply slice elements by corresponding elements of @a v.
void operator*=(const valarray<_Tp>&) const;
///  Divide slice elements by corresponding elements of @a v.
void operator/=(const valarray<_Tp>&) const;
///  Modulo slice elements by corresponding elements of @a v.
void operator%=(const valarray<_Tp>&) const;

也许这些可以成为热门,但我不明白@a v是什么意思。(然而,这只是一个例子,而不是证据。

有人有书面证据吗?

与任何标准功能一样,这些运算符由C++标准定义。

例如,在 C++14 中:

[C++14: 26.6.5.2]slice_array分配[slice.arr.assign]

void operator=(const valarray<T>&) const;const slice_array& operator=(const slice_array&) const;

1这些赋值运算符具有引用语义,将参数数组元素的值分配给slice_array对象所引用的valarray<T>对象的选定元素。

[C++14: 26.6.5.3]slice_array计算分配[slice.arr.comp.assign]

void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;

1这些计算赋值具有引用语义,将指示的操作应用于参数数组的元素以及slice_array对象所引用的valarray<T>对象的选定元素。

另一方面,文档注释与标准无关,是特定实现/工具链的作者的选择。@a几乎可以肯定是doxygen指令。