3

私の質問: 構造体に c-tor がある場合、静的に初期化できないのはなぜですか?

私のコンパイラの主張:

type `myStruct' must be initialized by constructor, not by `{...}'

何故ですか ?gcc バージョン 3.4.4 を使用しています (cygming スペシャル、gdc 0.12、dmd 0.125 を使用)

struct例として、コンパイラによって拒否されるを次に示します。

struct myStruct
{
    int a;
    double b;

    myStruct() { a= 0; b = 0.0; }
}

void main()
{
    myStruct ms = {7, 7.7}; // Now this compiler does not accept.
} 
4

4 に答える 4

7

ユーザー定義の c-tor が含まれているということは、それが集約型ではなくなったことを意味します。これは、それ自体のユーザー定義の c-torがなく、POD または集約型ではないstruct非静的データ メンバーがある場合にも当てはまります。struct

于 2012-08-28T15:47:37.470 に答える
4

言語がそれをそのように指定しているので...

その理由は、コンストラクターがオブジェクトを有効な状態に初期化するための指定された方法であるため、値をフィールドに直接ダンプするだけでは意味がありません。やりたいのは両方の少しになります。

于 2012-08-28T15:50:38.497 に答える
3

初期化子リストで初期化できるのは集約のみです。8.5.1:1 に従って、ユーザー提供のコンストラクターを含めると、構造体またはクラスが集約になるのを防ぎます。

8.5.1 集計 [dcl.init.aggr]

1 - 集約は、ユーザー提供のコンストラクターを持たない配列またはクラス (条項 9) です [...]

C++03 では、

8.5.1 - 集計 [dcl.init.aggr]

1 - 集約は、ユーザー宣言されたコンストラクターを持たない配列またはクラス (節クラス) です [...]

集計は POD とは異なります ( 9:10)。すべての集合体が POD であるとは限らず、すべての POD が集合体であるとは限りません。ユーザー提供のデストラクタを持つクラスは集約であっても POD ではない可能性がありますが、非コピーの非デフォルト コンストラクタを持つクラスは POD であっても集約ではない可能性があります。

デモンストレーション:

#include <type_traits>
#include <iostream>

struct non_pod_aggregate { int i, j; ~non_pod_aggregate() {} };
struct non_aggregate_pod { int i, j; non_aggregate_pod(int) {}
    non_aggregate_pod() = default; };

int main() {
    std::cout << std::is_pod<non_pod_aggregate>::value << '\n'; // false
    std::cout << std::is_pod<non_aggregate_pod>::value << '\n'; // true
    non_pod_aggregate{0, 0};
    // non_aggregate_pod{0, 0}; // does not compile
}

C++03 では、すべての POD ( 9:4) は集合体ですが、POD ではない集合体を持つことも可能です。上記のように、ユーザー提供のデストラクタは、構造体が POD であることを不適格にするのに十分です。

于 2012-08-28T15:57:37.873 に答える
1

C++03 では、リストの初期化は集計に対してのみ機能します。コンストラクターを呼び出すようにコードを変更する必要があります。

myStruct ms;

すべてのメンバーの値を指定できるようにしたい場合は、十分な引数を取るコンストラクターを追加する必要があります。

struct myStruct
{
    int a;
    double b;

    myStruct() : a(), b() { }
    myStruct(int a, double b) : a(a), b(b) { }
};

void main()
{
    myStruct ms(7, 7.7);
} 
于 2012-08-28T15:48:38.703 に答える