Здравствуйте, _Ursus_, Вы писали:
_U_>Здравствуйте, pro_gerr, Вы писали:
А>>>int i1 = int(); _>>А в чем собственно вопрос то?
_U_>Чувака поразил факт, что базовые типы тоже имеют конструктор.
меня бы этот факт тоже поразил, потому что они не имеют конструктора.
_U_>>Чувака поразил факт, что базовые типы тоже имеют конструктор.
J>меня бы этот факт тоже поразил, потому что они не имеют конструктора.
Привожу текст из английского оригинала своей любимейшой книги по C++: The C++ Programming Language (Special Edition) Bjarne Stroustrup.
Section 6 Expressions and Statements
6.2.8 Constructors
The construction of a value of type T from a value e can be expressed by the functional notation T(e). For Example:
void f(double d)
{
int i = int(d);
}
The T(e) construct is sometimes referred to as a function-style cast. Unfortunately, for a built-in type T, T(e) is equivalent to (T)e.
The constructor notationT() is used to express the default value of type T.
AK>... AK>Thus, int() is another way of writing 0.
Это именно constructor notation, т.е. просто запись в похожей форме. Конструктора у них все-таки нет. Что это за конструктор такой, если он не всегда вызывается при создании объекта?
Здравствуйте, Fwiffo, Вы писали:
F>Это именно constructor notation, т.е. просто запись в похожей форме. Конструктора у них все-таки нет. Что это за конструктор такой, если он не всегда вызывается при создании объекта?
А если бы был, вы его смогли отличить от Constructor notation?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, Fwiffo, Вы писали:
F>>Это именно constructor notation, т.е. просто запись в похожей форме. Конструктора у них все-таки нет. Что это за конструктор такой, если он не всегда вызывается при создании объекта? V>А если бы был, вы его смогли отличить от Constructor notation?
Не понял вопрос. Конструктор — это функция такая. Constructor notation — запис инициализации объектов.
Почему не назвать иницализацию нулем конструктором? Потому что она не подходит под определение конструктора и не ведет себя как конструктор:
int a = int(); // тут вызвался "конструктор"int a; // а тут нет...
Здравствуйте, Fwiffo, Вы писали:
F>Не понял вопрос. Конструктор — это функция такая. Constructor notation — запис инициализации объектов. F>Почему не назвать иницализацию нулем конструктором? Потому что она не подходит под определение конструктора и не ведет себя как конструктор: F>
F>int a; // а тут нет...
F>
А почему вы думаете, что он не вызвался?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
AbramKotkin:
AK>The constructor notationT() is used to express the default value of type T.
Это всего лишь неформальное объяснение Страуструпа. В стандарте это называется "Explicit type conversion (functional notation)" — см 5.2.3/2:
The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or the (possibly cv-qualified) void type, creates an rvalue of the specified type, which is value-initialized (8.5; no initialization is done for the void() case). [Note: if T is a non-class type that is cv-qualified, the cv-qualifiers are ignored when determining the type of the resulting rvalue (3.10). ]
8.5/5:
To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), 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 object is zero-initialized
To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
[...]
Никакого упоминания об использовании конструктора в данном случае.
AK>Thus, int() is another way of writing 0.
А вот тут, кстати, интересная ситуация. 0 — это не объект, а вот int() — это объект (value-initialization определена только для объектов). 5.19/1 позволяет использовать преобразования к integral type в integral constant-expression. Когда в следующем коде может быть создан временный объект и каково его время жизни?
Здравствуйте, Vain, Вы писали:
V>А почему вы думаете, что он не вызвался?
Потому что int() инициализировано нулём, а int x не инициализировано.
Хотя обе записи выглядят как дефолтный конструктор.
Вообще, логично было бы считать именно неинициализацию дефолтным конструктором. Такое поведение (отсутствие его ) наблюдается во всех случаях как-бы-конструирования, кроме одного
— int x; int x[N];
— new int; new int[N];
— POD-член в составе не-POD-структуры с нетривиальным неявно определённым дефолтным конструктором (выполняющим дефолтное конструирование баз и членов)
И только
— int(), new int()
обнуляет.