By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,915 Members | 1,280 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,915 IT Pros & Developers. It's quick & easy.

valarray Initialization Question

P: n/a
Stroustrup page 663 says this:

valarray<floatv1 (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<floatv1 (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<floatv1 (0.0, 1000);

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

Thanks!

-Alex
Mar 14 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
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
http://grizlyk1.narod.ru/cpp_new

"In thi world of fairy tales rolls are liked olso"
/Gnume/
Mar 22 '07 #2

P: n/a
Grizlyk <gr******@yandex.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
Mar 22 '07 #3

P: n/a
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:

http://groups.google.com/group/comp....b44a8b786b6a79
(read Dietmar Kuehl's reply to my post as well)

Allegedly this was fixed in 2005:
http://groups.google.com/group/micro...aa1c4286?tvc=2

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
Mar 22 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.