Details of why this happens are related to the implementation tricks used in valarrayto improve performance. Both libstdC ++ and libC ++ use expression patterns for the results of operations valarray, and not for immediate operations. This is explicitly permitted by [valarray.syn] p3 in the C ++ standard:
, valarray<T>, , valarray<T> .
, , arr/arr[0] , _Expr<__divide, _Valarray, _Constant, valarray<double>, double>, arr arr[0]. valarray, , ( valarray, , , ).
- , arr, , arr[0], , , arr .
, :
valarray<double> arr{5, 10, 15, 20, 25};
struct DivisionExpr {
const std::valarray<double>& lhs;
const double& rhs;
};
DivisionExpr divexpr = { arr, arr[0] };
for (int i = 0; i < size(); ++i)
arr[i] = divexpr.lhs[i] / divexpr.rhs;
for arr[0] arr[0] / arr[0] i.e. arr[0] = 1, arr[i] = arr[i] / 1, , .
libstd++, double , . , arr[i] / divexpr.rhs arr[i] / 5 arr[i].