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这种方式表现非标准吗?

+0

我倾向于同意你的看法。我在问这个问题后发现了* aggregates +的定义,并没有意识到与POD有所不同。 – towi

+0

@towi:最好的是看初始化,它直接引用聚合。 – jpalecek