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

Тема в разделе "Общие вопросы по С и С++", создана пользователем klizardin, 30 окт 2008.

  1. klizardin

    klizardin Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Насколько я понимаю, формально констуктор вызывается, но никакого кода компилятор не генерит. Я лично всегда считал что никакой инициализации нет делается намеренно, но по-хорошему надо стандарт почитать.
     
  3. klizardin

    klizardin Гость

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

    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.

    Код (Text):
    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:

    Код (Text):
    template<typename T>
    class MyClass
    {
    public:
    MyClass() : x() {}
    private:
    T x;
    };
    http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s03.html
     
Загрузка...

Поделиться этой страницей