про new и new()
От: Seneca Россия  
Дата: 16.02.05 10:26
Оценка:
Из чтения Стандарта (5.3.4.(15)) я понял что для НЕ POD типов, разницы между new и new() нет.
Рассмотрим такой код:
class A
{
    int X;
    int Y;
};
class B
{
    int X;
    int Y;
};

int main(int argc, char* argv[])
{
    A* a = new A;
    B* b = new B();
    return 0;
}


Судя по всему A и B это не POD типы, так как их члены protected, а ФАК http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.7
говорит о том, что "a POD type's non-static data members must be public".

Следовательно разницы быть не должно, а она есть.


— a 0x00322f10 {X=-842150451 Y=-842150451 } A *
X -842150451 int
Y -842150451 int
— b 0x00322f58 {X=0 Y=0 } B *
X 0 int
Y 0 int
Многоие знания сулят нам многие печали, и умножая знания мы умножаем печаль. (с) Екклезиаст.
Re: про new и new()
От: Lorenzo_LAMAS  
Дата: 16.02.05 10:34
Оценка:
Разница между new T и new T() для не POD типов по текущему (т.е. не 1998 года) стандарту есть, потому во втором случае у тебя нули — имеет место value-initialization.
Of course, the code must be complete enough to compile and link.
Re[2]: про new и new()
От: Lorenzo_LAMAS  
Дата: 16.02.05 10:43
Оценка:
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.


цитату можно?
Re[3]: про new и new()
От: Lorenzo_LAMAS  
Дата: 16.02.05 10:45
Оценка:
А>цитату можно?

См. выше
Of course, the code must be complete enough to compile and link.
Re[3]: про new и new()
От: Andreitch  
Дата: 16.02.05 10:49
Оценка:
С ()-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;

Re[4]: про new и new()
От: Lorenzo_LAMAS  
Дата: 16.02.05 10:54
Оценка:
Здравствуйте, Andreitch, Вы писали:

A>С ()-form у автора, как я понял, как раз все в порядке.


Да, просто его удивило, почему в таком варианте целые инициализируются нулями. Это value-initialization.


>Что гласит стандарт 2003 про вариант без скобок? в 98 написано (5.3.4 [15])


Эта часть не изменилась, но к первоначальному вопросу это не относится, по-моему.
Of course, the code must be complete enough to compile and link.
Re[5]: про new и new()
От: Аноним  
Дата: 16.02.05 10:59
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Да, просто его удивило, почему в таком варианте целые инициализируются нулями. Это value-initialization.

Нет. Читаем внимательно корневой пост

Следовательно разницы быть не должно, а она есть.

Автора удивила разница в поведении для non-POD типов, и я с ним согласен. Согласно стандарту, ее быть не должно. Поправьте меня, если это не так.
Re[6]: про new и new()
От: Lorenzo_LAMAS  
Дата: 16.02.05 11:05
Оценка:
А>Нет. Читаем внимательно корневой пост
А>

Следовательно разницы быть не должно, а она есть.

А>Автора удивила разница в поведении для non-POD типов, и я с ним согласен. Согласно стандарту, ее быть не должно. Поправьте меня, если это не так.

Я предлагаю все не усложнять. В версии стандарта, о которой говорит автор, нет понятия value-initialization.В стандарте 2003 года, текст другой, я привел отрывки из него.
Of course, the code must be complete enough to compile and link.
Re[7]: про new и new()
От: Andreitch  
Дата: 16.02.05 11:08
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Я предлагаю все не усложнять. В версии стандарта, о которой говорит автор, нет понятия value-initialization.В стандарте 2003 года, текст другой, я привел отрывки из него.


То есть, теперь default-initialization не предполагает вызова конструктора по-умолчанию?
Re[8]: про new и new()
От: Lorenzo_LAMAS  
Дата: 16.02.05 11:12
Оценка:
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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.