value-initialization

Andrew Koenig ark@research.att.com
Fri Apr 30 23:15:00 GMT 1999


Mark> Yes, I do.  What exactly are the new requirements?

Thanks for the quick response!

Initialization is changed in two contexts:

     1. An expression of the form T()  (with no arguments in the ())

     2. An element of an array that is brace-initialized, but
        for which there is no corresponding initializer (i.e.
	the elements that are left over when you run out of
	initializers)

The standard says that such objects are default-initialized.

The revision introduces a new concept called ``value-initialized,''
defined as follows:

	To value-initialize an object of type T means:

	If T is a class type with a user-declared constructor,
	then the default constructor for T is called (and the
	initialization is ill-formed if T has no accessible
	default constructor);

	If T is a non-union class type without a user-declared
	constructor, then every non-static data member and base-class
	component of T is value-initialized;

	If T is an array type, then each element is value-initialized;

	Otherwise, the storage for the object is zero-initialized.

The difference is relevant for class types that do not have a
user-defined constructor, but which have members or base class
components that do have user-defined constructors.  Such classes
appear to be PODs from the outside, but aren't PODs because they
have constructors buried within them.  I call such classes
pseudoPODs, though of course that term isn't official :-)

Anyway, the point is that if we have a class such as

	struct T {
	       int a;
	       X x;
	};

The standard says that whether T().a is defined depends on whether
X has a constructor.  The revision says that T().a is always zero,
because T does not have a user-defined constructor.


Hope this helps.       --ark




More information about the Gcc-bugs mailing list