В 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] ), но ссылки не упоминаютсятам, так что я не уверен, как они относятся к этому