在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
{ /* ... */ }
}
当我玩这个例子时,我用 a 替换*
了&
,因为我不喜欢原始指针:
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 可能包含指针,但没有引用。
操作,现在我想知道:
- 我这里是否有非 POD 对象,编译器无论如何都可以在没有构造函数的情况下对其进行初始化,而我只是想念这里使用了哪些机制?
- 或者GCC-4.7.0 是否通过让我以这种方式初始化 ref 来表现非标准?
- 还是自 Bjarnes FAQ 以来 std 发生了变化,也允许在 POD 中引用?
更新:我在当前 std ( 8.5.1 Aggregates [dcl.init.aggr] ) 中找到了聚合,但那里没有提到引用,所以我不确定它们与这个有什么关系