[ 
https://issues.apache.org/jira/browse/STDCXX-693?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12557908#action_12557908
 ] 

Martin Sebor commented on STDCXX-693:
-------------------------------------

I agree that the wording in the standard does require it, although I suspect 
this interpretation was not intended (I could be wrong). GNU libstdc++ behaves 
the same as stdcxx, but STLport does what you expect. The straightforward fix 
is to copy the first element to the accumulator:

Index: include/valarray
===================================================================
--- include/valarray    (revision 609201)
+++ include/valarray    (working copy)
@@ -174,7 +174,7 @@
 
     // 26.3.2.7, p2
     value_type sum () const {
-        return accumulate (_C_array.begin (), _C_array.end (), value_type ());
+        return accumulate (_C_array.begin () + 1, _C_array.end (), _C_array 
[0]);
     }
 
     // 26.3.2.7, p3


Rather than implementing it, I would like to replace the use of 
std::accumulate() with a simple loop like so:


Index: include/valarray
===================================================================
--- include/valarray    (revision 609201)
+++ include/valarray    (working copy)
@@ -173,9 +173,7 @@
     }
 
     // 26.3.2.7, p2
-    value_type sum () const {
-        return accumulate (_C_array.begin (), _C_array.end (), value_type ());
-    }
+    value_type sum () const;
 
     // 26.3.2.7, p3
     value_type (min)() const {

Index: include/valarray.cc
===================================================================
--- include/valarray.cc (revision 609201)
+++ include/valarray.cc (working copy)
@@ -31,6 +31,18 @@
 
 
 template <class _TypeT>
+_TypeT valarray<_TypeT>::sum () const
+{
+    _TypeT __sum (_C_array [0]);
+
+    for (_RWSTD_SIZE_T __i = 1; __i < _C_array.size (); ++__i)
+        __sum += _C_array [__i];
+
+    return __sum;
+}
+
+
+template <class _TypeT>


> std::valarray::sum does not work correctly for udt that has nonzero default 
> value
> ---------------------------------------------------------------------------------
>
>                 Key: STDCXX-693
>                 URL: https://issues.apache.org/jira/browse/STDCXX-693
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 26. Numerics
>    Affects Versions: 4.2.0
>            Reporter: Travis Vitek
>            Priority: Minor
>
> #include <cassert>
> #include <valarray>
> struct S
> {
>     // this ctor should not be required
>     S ()
>         : value (21)
>     {
>     }
>     S (int v)
>         : value (v)
>     {
>     }
>     S (const S& rhs)
>         : value (rhs.value)
>     {
>     }
>     S& operator+= (const S& rhs)
>     {
>         value += rhs.value;
>         return *this;
>     }
>     int value;
> };
> int main ()
> {
>     const std::valarray<S> b (S (10), 1); // 10 elements with value 1
>     assert (b.sum ().value == 10);
>     return 0;
> } 
> The wording in the standard seems to imply that the returned value should be 
> a copy of one of the elements, and that op+= should be called on all of the 
> other elements. If this is the case, then this an additional issue that would 
> be detectable in user code [the user can count how many times the op+= is 
> invoked]. This issue may apply to the min() and max() methods as well.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to