valarray Initialization Question
Stroustrup page 663 says this:
valarray<float> v1 (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<float> v1 (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<float> v1 (0.0, 1000);
but I'd still like to know exactly what the single-argument constructor
is actually supposed to do.
Thanks!
-Alex