• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

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

klizardin

есть код
Код:
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()) и специфицировано ли поведение этого конструктора? А также специфицированы ли другие конструкторы для базовых типов?
 
G

grigsoft

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

klizardin

Насколько я понимаю, формально констуктор вызывается, но никакого кода компилятор не генерит. Я лично всегда считал что никакой инициализации нет делается намеренно, но по-хорошему надо стандарт почитать.

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

klizardin

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;
};

 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!