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、今私は疑問に思います:
- とにかく、コンパイラーがコンストラクターなしで初期化できる非PODオブジェクトがここにありますか?ここで使用されているメカニズムを見逃していますか?
- または、GCC-4.7.0 は、この方法で参照を初期化することによって非標準の動作をしていますか?
- または、POD での参照も許可する Bjarnes FAQ 以来、std に変更がありましたか?
更新:現在の std ( 8.5.1 Aggregates [dcl.init.aggr] ) で集計が見つかりましたが、そこには参照が記載されていないため、それらがこれにどのように関連しているかはわかりません