valarray Initialization Question

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Alex Howlett

    #1

    valarray Initialization Question

    Stroustrup page 663 says this:

    valarray<floatv 1 (1000); // 1000 elements with value
    float()==0.0F

    But when I run this program:

    --------------------------------------
    #include <valarray>
    #include <iostream>

    int main (int argc, char * argv[])
    {
    std::valarray<f loatv1 (1000);
    std::cout << v1[0];

    return 0;
    }
    --------------------------------------

    My output is this:
    -4.31602e+008

    My compiler is Microsoft Visual C++ 2005.

    Unless I'm missing something, my compiler seems to be contradicting
    Stroustrup. So I decided to have a look at the standard.

    25.6.2.1 of the standard says this:

    --------------------------------------
    explicit valarray (size_t);

    The array created by this constructor has a length equal to the value
    of the argument. The elements of the array are constructed using the
    default constructor for instantiating type T.
    --------------------------------------

    I searched around the standard a bit and I can't really find anything
    about whether the POD types actually have default constructors or not.

    Section 8.5 says this:
    --------------------------------------
    5. ...

    To default-initialize an object of type T means:

    - if T is a non-POD class type (clause 9), the default constructor for
    T is called (and the initialization is illformed if T has no accessible
    default constructor);
    - if T is an array type, each element is default-initialized;
    - otherwise, the object is zero-initialized
    --------------------------------------

    Now, I take that to mean that default-initializing an object of a POD
    type is the same as zero-initializing it. The problem is that the
    valarray constructor in question isn't said to default-initialize its
    elements. It's said to construct them using the default constructor.

    Section 12.6 says this:

    --------------------------------------
    1. When no initializer is specified for an object of (possibly
    cv-qualified) class type (or array thereof, or the initializer has the
    form (), the object is initialized as specified in 8.5.
    --------------------------------------

    But what about an object of POD type?

    Obviously, I can do this to get the desired effect:

    std::valarray<f loatv1 (0.0, 1000);

    but I'd still like to know exactly what the single-argument constructor
    is actually supposed to do.

    Thanks!

    -Alex


  • Grizlyk

    #2
    Re: valarray Initialization Question

    Alex Howlett wrote:
    >
    Section 8.5 says this:
    --------------------------------------
    5. ...
    >
    To default-initialize an object of type T means:
    >
    - if T is a non-POD class type (clause 9), the default constructor for T
    is called (and the initialization is illformed if T has no accessible
    default constructor);
    - if T is an array type, each element is default-initialized;
    - otherwise, the object is zero-initialized
    At least this (zero-initialized) is strange, because as i know

    {
    int a;
    a+=1;
    return a;
    }

    will return undefined value, it is not the same as

    {
    int a(0);
    a+=1;
    return a;
    }


    --
    Maksim A. Polyanin


    "In thi world of fairy tales rolls are liked olso"
    /Gnume/


    Comment

    • Marcus Kwok

      #3
      Re: valarray Initialization Question

      Grizlyk <grizlyk1@yande x.ruwrote:
      Alex Howlett wrote:
      >>
      >Section 8.5 says this:
      >--------------------------------------
      >5. ...
      >>
      >To default-initialize an object of type T means:
      >>
      >- if T is a non-POD class type (clause 9), the default constructor for T
      >is called (and the initialization is illformed if T has no accessible
      >default constructor);
      >- if T is an array type, each element is default-initialized;
      >
      >- otherwise, the object is zero-initialized
      >
      At least this (zero-initialized) is strange, because as i know
      >
      {
      int a;
      a+=1;
      return a;
      }
      >
      will return undefined value, it is not the same as
      >
      {
      int a(0);
      a+=1;
      return a;
      }
      Try this:

      {
      int a = int();
      a += 1;
      return a;
      }

      I think the different types of initialization are: default-initialize,
      value-initialize, and zero-initialize. For primitive types,
      value-initialize and zero-initialize are the same, but
      default-initialize leaves the value in an indeterminate state.

      --
      Marcus Kwok
      Replace 'invalid' with 'net' to reply

      Comment

      • Marcus Kwok

        #4
        Re: valarray Initialization Question

        Alex Howlett <a.l_e.x_AT.s_u .n_c.h_o.D@t_c. o_mwrote:
        Section 8.5 says this:
        --------------------------------------
        5. ...
        >
        To default-initialize an object of type T means:
        >
        - if T is a non-POD class type (clause 9), the default constructor for
        T is called (and the initialization is illformed if T has no accessible
        default constructor);
        - if T is an array type, each element is default-initialized;
        - otherwise, the object is zero-initialized
        --------------------------------------
        Also, sorry for not answering your original question, but VC++ .NET 2003
        does not correctly value-initialize arrays; see the following two
        threads:


        (read Dietmar Kuehl's reply to my post as well)

        Allegedly this was fixed in 2005:


        I do not have 2005 installed so I cannot test it, but I wonder whether
        the valarray issue you are experiencing is related to this bug.

        --
        Marcus Kwok
        Replace 'invalid' with 'net' to reply

        Comment

        Working...