123. Should valarray helper arrays fill functions be const?

Section: 29.6.5.4 [slice.arr.fill], 29.6.7.4 [gslice.array.fill], 29.6.8.4 [mask.array.fill], 29.6.9.4 [indirect.array.fill] Status: CD1 Submitter: Judy Ward Opened: 1998-12-15 Last modified: 2016-01-28

Priority: Not Prioritized

View all issues with CD1 status.

Discussion:

One of the operator= in the valarray helper arrays is const and one is not. For example, look at slice_array. This operator= in Section 29.6.5.2 [slice.arr.assign] is const:

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

but this one in Section 29.6.5.4 [slice.arr.fill] is not:

    void operator=(const T&);

The description of the semantics for these two functions is similar.

Proposed resolution:

29.6.5 [template.slice.array] Template class slice_array

In the class template definition for slice_array, replace the member function declaration

      void operator=(const T&);
    

with

      void operator=(const T&) const;
    

29.6.5.4 [slice.arr.fill] slice_array fill function

Change the function declaration

      void operator=(const T&);
    

to

      void operator=(const T&) const;
    

29.6.7 [template.gslice.array] Template class gslice_array

In the class template definition for gslice_array, replace the member function declaration

      void operator=(const T&);
    

with

      void operator=(const T&) const;
    

29.6.7.4 [gslice.array.fill] gslice_array fill function

Change the function declaration

      void operator=(const T&);
    

to

      void operator=(const T&) const;
    

29.6.8 [template.mask.array] Template class mask_array

In the class template definition for mask_array, replace the member function declaration

      void operator=(const T&);
    

with

      void operator=(const T&) const;
    

29.6.8.4 [mask.array.fill] mask_array fill function

Change the function declaration

      void operator=(const T&);
    

to

      void operator=(const T&) const;
    

29.6.9 [template.indirect.array] Template class indirect_array

In the class template definition for indirect_array, replace the member function declaration

      void operator=(const T&);
    

with

      void operator=(const T&) const;
    

29.6.9.4 [indirect.array.fill] indirect_array fill function

Change the function declaration

      void operator=(const T&);
    

to

      void operator=(const T&) const;
    

[Redmond: Robert provided wording.]

Rationale:

There's no good reason for one version of operator= being const and another one not. Because of issue 253, this now matters: these functions are now callable in more circumstances. In many existing implementations, both versions are already const.