From cppreference.com
valarray<T>&operator=(constvalarray<T>&other); (1) valarray<T>&operator=(valarray<T>&&other)noexcept; (2) (since C++11)valarray<T>&operator=(constT&val); (3) valarray<T>&operator=(conststd::slice_array<T>&other); (4) valarray<T>&operator=(conststd::gslice_array<T>&other); (5) valarray<T>&operator=(conststd::mask_array<T>&other); (6) valarray<T>&operator=(conststd::indirect_array<T>&other); (7) valarray<T>&operator=(std::initializer_list<T>il); (8) (since C++11)Replaces the contents of the numeric array.
1) Copy assignment operator. If size()!=other.size(), first resizes *this as if by resize(other.size()). Each element of *this is assigned the value of the corresponding element of other.
2) Move assignment operator. Replaces the contents of *this with those of other. The value of other is unspecified after this operation. The complexity of this operation may be linear if T has non-trivial destructors, but is usually constant otherwise.
3) Replaces each value in *this with a copy of val.
4-7) Replaces the contents of *this with the result of a generalized subscripting operation. The behavior is undefined if
does not equal the length of other or if any value on the left depends on the value on the right (e.g. v=v[v>2]).
8) Assigns the contents of initializer list il. Equivalent to *this=valarray(il).
Parameters
other - another numeric array (or a mask) to assign val - the value to initialize each element with il - initializer list to assign Return value
*this
Exceptions
1,3-8) May throw implementation-defined exceptions.
Example
Run this code
#include<iomanip>#include<iostream>#include<valarray>voidprint(constchar*rem,conststd::valarray<int>&v){std::cout<<std::left<<std::setw(36)<<rem<<std::right;for(intn:v)std::cout<<std::setw(3)<<n;std::cout<<'\n';}intmain(){std::valarray<int>v1(3);v1=-1;// (3) from a scalar print("assigned from scalar: ",v1);v1={1,2,3,4,5,6};// (8): from initializer list of different sizeprint("assigned from initializer_list:",v1);std::valarray<int>v2(3);v2=v1[std::slice(0,3,2)];// (4): from slice arrayprint("every 2nd element starting at pos 0:",v2);v2=v1[v1%2==0];// (6): from mask arrayprint("values that are even:",v2);std::valarray<std::size_t>idx={0,1,2,4};// index arrayv2.resize(4);// sizes must match when assigning from gen subscriptv2=v1[idx];// (7): from indirect arrayprint("values at positions 0, 1, 2, 4:",v2);}Output:
assigned from scalar: -1 -1 -1 assigned from initializer_list: 1 2 3 4 5 6 every 2nd element starting at pos 0: 1 3 5 values that are even: 2 4 6 values at positions 0, 1, 2, 4: 1 2 3 5 Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++98 the behaviors of overloads (4-7) were
unclear if the length of other is not
the behaviors are
undefined in this case
C++98 the behavior of the copy assignment operator
was undefined if size()!=other.size()resizes *this
first in this case
C++11 the move assignment operator resized
*this if size()!=other.size()not required to
resize in this case