18

次の例を検討してください。

#include <iostream>
#include <string>
struct ABC
{
    std::string str;
    unsigned int id ;/* = 0 : error: no matching constructor for initialization of 'ABC'*/
};

int main()
{
    ABC abc{"hi", 0};
    std::cout << abc.str << " " << abc.id <<   std::endl;
    return 0;
}

id clang 3.x および gcc 4.8.x のデフォルト値なしで構造体 ABC を定義すると、コードは問題なくコンパイルされます。ただし、「id」のデフォルト引数を追加すると、次のようなエラー メッセージが表示されます。

13 : error: no matching constructor for initialization of 'ABC'
ABC abc{"hi", 0};
^ ~~~~~~~~~
4 : note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
struct ABC
^
4 : note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided
4 : note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 2 were provided
1 error generated.
Compilation failed

技術的な観点から、デフォルトの引数で id を定義するとどうなりますか?また、その場合、集計の初期化ができないのはなぜですか? ある種のコンストラクターを暗黙的に定義しますか?

4

2 に答える 2

33

Bjarne Stroustrup と Richard Smith は、集約の初期化とメンバー初期化子が連携しないという問題を提起しました。

C++11 & C++14 標準では、aggregate の定義が若干変更されています。

C++11 標準ドラフトn3337セクション 8.5.1 から、次のように述べられています。

集合体は、ユーザー提供のコンストラクター (12.1)、非静的データ メンバーのブレースまたはイコール初期化子(9.2)、プライベートまたは保護された非静的データ メンバー (条項 11)、基本クラスなし (条項 10)、および仮想関数なし (10.3)。

しかし、C++14 標準ドラフトn3797セクション 8.5.1 は次のように述べています。

集約は、ユーザー提供のコンストラクター (12.1)、プライベートまたは保護された非静的データ メンバー (条項 11)、基本クラス (条項 10)、および仮想関数 (10.3) を持たない配列またはクラス (条項 9) です。 )。

そのため、C++11 でデータ メンバーに対してin class member initializer (つまり equal initializer ) を使用すると、それはもはや集計のままではなく、初期化するためにid書き込むことはできません。しかし、あなたのコードは C++14 で有効です。(ライブデモはこちら)。ABC abc{"hi", 0};struct ABC.

于 2016-03-09T12:44:40.560 に答える
-1

C++ では、構造体には既定のパブリック メンバーがあり、クラスにはプライベート メンバーがあることを除いて、構造体とクラスは同じです。初期値を使用したい場合は、コンストラクターを作成するか、次のようなものを使用する必要があると思います:

struct ABC
{
    std::string str;
    unsigned int id;
} ABC_default = {"init", 0 }; //initial values

int main()
{
    ABC abc = ABC_default;
    std::cout << abc.str << " " << abc.id << std::endl;
    return 0;
}
于 2016-03-09T12:34:42.570 に答える