C ++ 0x Инициализация члена без конструктора - PullRequest
4 голосов
/ 27 августа 2011

В N3257 Я нашел пример использования инициализации элементов без конструктора , что нормально.Я думаю, это возможно, потому что это POD.

template<typename T>
struct adaptor {
    NonStdContainer<T>* ptr;                // <- data member
    T* begin() { return ptr->getFirst(); }
    T* end() { return ptr->getLast() + 1; }
};
void f(NonStdContainer<int>& c) {
    for (auto i : adaptor<int>{&c})         // <- init
        { /* ... */ }
}

Когда я поиграл с этим примером, я заменил * на &, потому что я не люблю необработанные указатели:

template<typename T>
struct adaptor {
    NonStdContainer<T>& ptr;                // <- data member, now REF
    T* begin() { return ptr->getFirst(); }
    T* end() { return ptr->getLast() + 1; }
};
void f(NonStdContainer<int>& c) {
    for (auto i : adaptor<int>{c})         // <- init
        { /* ... */ }
}

Это было нормально и скомпилировано без предупреждения с GCC-4.7.0.

Затем мне стало интересно узнать об инициализации POD и о том, что могло бы измениться с C ++ 0x.Там я нашел Bjarnes FAQ .Там он говорит, что POD может содержать указателей , но не ссылок .

Ops, теперь мне интересно:

  • DoУ меня есть не POD-объект, который компилятор может инициализировать без конструктора в любом случае , и я просто скучаю, какие механизмы здесь используются?
  • или GCC-4.7.0 ведет себя не-std , позволив мне инициализировать ссылку таким образом?
  • или Произошло ли изменение в std после FAQ по Bjarnes, которое также допускает ссылки в POD?

Обновление: Я нашел агрегатов в текущем стандарте ( 8.5.1 Агрегаты [dcl.init.aggr] ), но ссылки не упоминаютсятам, так что я не уверен, как они относятся к этому

1 Ответ

4 голосов
/ 10 сентября 2011

Цитируя стандарт [dcl.init.aggr]:

Агрегат - это массив или класс (раздел 9) без предоставленных пользователем конструкторов (12.1), без скобок илиравные инициализаторы для нестатических элементов данных (9.2), без личных или защищенных нестатических элементов данных (пункт 11), без базовых классов (пункт 10) и без виртуальных функций (10.3).

Когдаагрегат инициализируется списком инициализаторов, как указано в 8.5.4, элементы списка инициализаторов берутся в качестве инициализаторов для элементов агрегата в порядке возрастания индекса или элемента.Каждый элемент инициализируется копией из соответствующего предложения initializer ...

Это означает, что у вас есть агрегат, агрегаты могут быть инициализированы так, как вы это делаете.POD не имеют к этому никакого отношения, они действительно предназначены для общения, например.C.

Копирование-инициализация ссылки с переменной, безусловно, допустимо, потому что это просто означает

T& ref = c;

Есть ли здесь не-POD-объект, который компиляторвсе равно можно инициализировать без конструктора, и я просто скучаю, какие механизмы здесь используются?

Да, объект не является POD.

Является ли GCC-4.7.0вести себя не стандартно, позволяя мне инициализировать ссылку таким образом?

Нет.

...