gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:26:52 27 4
gpt4 key购买 nike

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 是否表现非标准 让我以这种方式初始化 ref ?
  • 自从 Bjarnes FAQ 也允许在 POD 中引用之后,std 是否发生了变化?

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

    最佳答案

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

    An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal- initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

    When an aggregate is initialized by an initializer list, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order. Each member is copy-initialized from the corresponding initializer-clause...



    这意味着您在这里有一个聚合,聚合可以按照您的方式进行初始化。 POD 与它无关,它们真正用于与例如通信。 C。

    使用变量的引用的复制初始化当然是合法的,因为这只是意味着
    T& ref = c;

    Do I have non-POD-object here, which the compiler can initialize without a constructor anyway and I just miss which mechanisms are used here?



    是的,对象是非 POD。

    Is the GCC-4.7.0 behaving non-std by letting me initializing the ref this way?



    不。

    关于c++11 - C++0x 没有构造函数的成员初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215647/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com