конструктор по умолчанию для примитивных типов

  • Автор темы klizardin
  • Дата начала
K

klizardin

#1
есть код
Код:
template <typename _Type>
struct AT
{
_Type& get_fish()
{
static _Type fish;
return fish;
}
};

struct A
{
};

void some_func()
{
AT<long> a1;
long v1 = a1.get_fish();
AT<A> a2;
A v2 = a2.get_fish();
}
Понятно, что при вызове a2.get_fish() будет вызван конструктор struct A, а вот при вызове a1.get_fish() будет ли вызываться конструктор (long()) и специфицировано ли поведение этого конструктора? А также специфицированы ли другие конструкторы для базовых типов?
 

grigsoft

Well-known member
15.11.2005
735
0
#2
Насколько я понимаю, формально констуктор вызывается, но никакого кода компилятор не генерит. Я лично всегда считал что никакой инициализации нет делается намеренно, но по-хорошему надо стандарт почитать.
 
K

klizardin

#3
Насколько я понимаю, формально констуктор вызывается, но никакого кода компилятор не генерит. Я лично всегда считал что никакой инициализации нет делается намеренно, но по-хорошему надо стандарт почитать.
Вообще-то, проверил на MSVC, он код генерит (типа xor eax,eax; mov ds:[edi],eax;) но вот насчет переносимости не уверен. В стандарте упоминается, что для примитивных переменных членов для классов структур вызывается конструктор, но он ничего не делает, но вот в темплейтах код несколько иной. Правда это может быть только MSVC specific быть. Хотя вполне логично чтобы был такой код, хотя м.б. и не во всех ситуациях. В том же vector<> он будет весьма тормозить, зато в других ситуациях этот код помогал бы упростить написание темплейтов.
 
K

klizardin

#4
Explicit call of default constructor

The fundamental types, like int, double, etc. has no default constructor. To ensure initialization of such values as template parameters, we can use the explicit call of constructor.

Код:
template<typename T>
void foo()
{
T x = T();
// ...
}
To make sure, that this happens with the subobjects to, you should use the initializer list of the constructor:

Код:
template<typename T>
class MyClass
{
public:
MyClass() : x() {}
private:
T x;
};
http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s03.html