13

クラスが集約クラスの優れたプロパティを失うことになる集約パブリック基本クラス (または複数の集約パブリック基本クラス) を持つことについてはどうですか?

http://en.cppreference.com/w/cpp/language/aggregate_initialization http://en.wikipedia.org/wiki/C++_classes#Aggregate_classesからの「集約基本クラス」の定義


集約クラスの優れた特性:

  • コンストラクターを定義せずに、中括弧で囲まれた値のリストを渡してメンバー (許可されている場合は基底クラス) を初期化することで、集約型を初期化できます。
  • 集約型は「単純」( PODの一般化) と見なされ、 constexprsの目的でリテラル型として使用できます。

http://en.cppreference.com/w/cpp/language/aggregate_initialization#Exampleからの初期化の要約例:

#include <string>
#include <array>
struct S {
  int x;
  struct Foo {
    int i;
    int j;
    int a[3];
  } b;
};

int main()
{
  S s1 = { 1, { 2, 3, {4, 5, 6} } };
  S s2 = { 1, 2, 3, 4, 5, 6}; // same, but with brace elision
}

参照: Aggregate と POD とは何ですか? また、どのように/なぜそれらが特別なのですか?

4

4 に答える 4

4

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3308.pdfによると

標準の明確な意図にもかかわらず、型 B はリテラル型ではありません。

struct A {}; struct B : A {};

これは、odr が使用されるまでそのコンストラクターが暗黙的に定義されておらず、その時点まで constexpr コンストラクターがないためです。

正直なところ、これが何を意味するのかはわかりません。

于 2013-11-08T23:43:50.483 に答える
2

基本クラスをどのように初期化しますか?

Derived d = {{1, 2}, 3, 4};

または

Derived d = {1, 2, 3, 4};

Derived d = {3, 4};

許可?

このすべてを回避するために、基本クラスはありません。

于 2013-11-07T21:18:12.930 に答える