C ++ 0x没有构造函数的成员初始化

时间:2011-08-27 16:00:02

标签: pod c++11 member-initialization

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对象,编译器可以在没有构造函数的情况下初始化,我只是想念这里使用的机制?
  • 允许我以这种方式初始化ref,GCC-4.7.0是否表现为非标准
  • 自Bjarnes常见问题解答以来是否允许在POD中引用,标准有变化吗?

更新我在当前的std( 8.5.1 Aggregates [dcl.init.aggr] )中找到聚合,但引用是那里没有提到,所以我不确定它们与这个有什么关系

1 个答案:

答案 0 :(得分:4)

引用标准[dcl.init.aggr]:

  

聚合是一个没有用户提供的数组或类(第9条)   构造函数(12.1),非静态的支撑或相等初始化器   数据成员(9.2),没有私有或受保护的非静态数据成员   (第11条),没有基类(第10条),也没有虚函数   (10.3)。

     

当聚合由初始化列表初始化时,如指定的那样   在8.5.4中,初始化列表的元素被视为   增加下标的聚合成员的初始化程序   或会员订单。每个成员都是从相应的初始化子句......复制初始化的。

这意味着你在这里有一个聚合,聚合可以初始化你如何做。 POD与它无关,它们实际上是用于与例如通信。下进行。

使用变量进行复制初始化肯定是合法的,因为这只是意味着

T& ref = c;
  

我是否有非POD对象,编译器可以在没有构造函数的情况下进行初始化,我只是想念这里使用的机制?

是的,该对象是非POD。

  

GCC-4.7.0是否通过这种方式初始化ref而表现为非std?

没有