Разница между new T и new T() для не POD типов по текущему (т.е. не 1998 года) стандарту есть, потому во втором случае у тебя нули — имеет место value-initialization.
Of course, the code must be complete enough to compile and link.
L_L>Разница между new T и new T() для не POD типов по текущему (т.е. не 1998 года) стандарту есть, потому во втором случае у тебя нули — имеет место value-initialization.
Вот что у меня в ревижне к стандарту :
5.3.4/15
A new-expression that creates an object of type T initializes that object as follows:
...
— if the new-initializer is of the form (), the item is value-initialized (8.5)
...
8.5
To value-initialize an object of type T means:
...
— if T is a non-union class without a user-declared constructor, then every non-static data member and base
class component of T is value-initialized
...
— otherwise, the object is zero-initialized (я опустил многие пункты, но этот otherwise — это как раз члены-
данные, которые у тебя 0)
Of course, the code must be complete enough to compile and link.
Re[2]: про new и new()
От:
Аноним
Дата:
16.02.05 10:44
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Разница между new T и new T() для не POD типов по текущему (т.е. не 1998 года) стандарту есть, потому во втором случае у тебя нули — имеет место value-initialization.
С ()-form у автора, как я понял, как раз все в порядке. Что гласит стандарт 2003 про вариант без скобок? в 98 написано (5.3.4 [15])
— If the new-initializer is omitted:
— If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default- initialized (8.5) If T is a const-qualified type, the underlying class type shall have a user-declared default constructor.
— Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed;
А>Автора удивила разница в поведении для non-POD типов, и я с ним согласен. Согласно стандарту, ее быть не должно. Поправьте меня, если это не так.
Я предлагаю все не усложнять. В версии стандарта, о которой говорит автор, нет понятия value-initialization.В стандарте 2003 года, текст другой, я привел отрывки из него.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Я предлагаю все не усложнять. В версии стандарта, о которой говорит автор, нет понятия value-initialization.В стандарте 2003 года, текст другой, я привел отрывки из него.
То есть, теперь default-initialization не предполагает вызова конструктора по-умолчанию?
A>То есть, теперь default-initialization не предполагает вызова конструктора по-умолчанию?
т.е. для случая new NonPodType() речь идет о value-initialization, а не default-initialization, далее
в 8.5 (пардон, этот кусок я опустил )
-if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is called...
Но у нас его нету, и потому
— if T is a non-union class without a user-declared constructor, then every non-static data member and base
class component of T is value-initialized
...
— otherwise, the object is zero-initialized
Of course, the code must be complete enough to compile and link.