C++ 0x没有构造函数的成员初始化
问题描述:
在N3257我找到一个例子,使用初始化没有构造函数的成员,这很好。我想这是可能的,因为它是一个POD。C++ 0x没有构造函数的成员初始化
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可能包含指针,但是没有参考文献。
行动,现在我不知道:
- 难道我非POD对象在这里,该编译器可以在没有构造函数初始化反正,我只是错过哪些机制在这里使用?
- 或GCC-4.7.0通过让我初始化ref这种方式表现非标准?
- 或由于Bjarnes常见问题,还允许在PODs中引用std中是否有变化?
更新:我发现聚集当前STD(8.5.1聚集体dcl.init.aggr]),但引用不存在提及,所以我不知道他们是如何涉及到这个
答
引用的标准[dcl.init.aggr]:
聚集是一个数组或类(第9节)没有用户提供的 构造(12.1),没有私有或受保护的非静态数据成员 (第11章),没有基类(第10章),也没有虚拟函数 (10.3) 。
当集合由初始化列表初始化,如SPECI网络连接在8.5.4编 ,初始化器列表的元素被作为 初始化为聚集体的成员,在增加下标 或部件的顺序。每个成员都从相应的初始化子句复制初始化...
这意味着你在这里有一个聚合,聚合可以初始化你是如何做到的。 POD与它无关,它们的确用于与例如。 C。用变量的引用的
复制初始化肯定是合法的,因为这只是意味着
T& ref = c;
难道我非POD对象在这里,该编译器可以在没有构造反正初始化和我只想念在这里使用了哪些机制?
是的,该对象是非POD。
GCC-4.7.0通过让我初始化ref这种方式表现非标准吗?
号
我倾向于同意你的看法。我在问这个问题后发现了* aggregates +的定义,并没有意识到与POD有所不同。 – towi
@towi:最好的是看初始化,它直接引用聚合。 – jpalecek