53

C ++ 11では、非静的データメンバーが宣言で初期化されている場合、それらを「自動」として宣言できますか?例えば:

struct S
{
    auto x = 5;  // in place of 'int x = 5;', which is definitely allowed
};

GCC 4.7は上記のコードを拒否しますが、を受け入れますint x = 5;

これがコンパイラのバグではなく、標準では実際には許可されていないと仮定すると、なぜでしょうか。ローカル変数を宣言するのと同じくらい便利ですauto

4

2 に答える 2

68

非静的メンバーを禁止するための規則は、7.1.6.4節4にあります。

自動型指定子は、選択ステートメント(6.4)または反復ステートメント(6.5)の条件で、new-type-idまたはtype-idのtype-specifier-seqで変数を宣言する際にも使用できます。 new-expression(5.3.4)、for-range-declaration、および クラス定義(9.4.2)のメンバー仕様内に表示される中括弧または等しいイニシャライザーを使用して静的データメンバーを宣言する場合。

ジェームズ・マクネリスがコメントでそれをどのように説明しているかを反映して、ここで静的である理由を見つけました。

ある国の機関は、非静力学の自動型指定子を許可することを嫌っています。電子メールから著者へ:

    template< class T >
    struct MyType : T {
      auto data = func();
      static const size_t erm = sizeof(data);
    };

Xのレイアウトを決定するために、2フェーズの名前ルックアップとADLがあります。funcは型または関数のいずれかである可能性があることに注意してください。これは、T、MyTypeの名前空間、インスタンス化されたときのTの関連する名前空間、グローバル名前空間、匿名の名前空間、またはusingディレクティブの対象となる任意の名前空間にあります。注意して、運のためにconcept_mapルックアップを投入することができます。ヘッダーを含める順序によっては、ADLで異なる結果が得られ、診断する必要のない単一定義規則に違反する場合もあります。

この論争のために、著者は、非静的データメンバーに対して自動を許可することをもはや提案していません。

したがって、基本的にヘッダーを含める順序に応じて、タイプはdata大きく異なる可能性があります。もちろん、auto x = 5;2フェーズの名前検索やADLに依存する必要はありませんが、それ以外の場合は、ユースケースごとに個別のルールを作成する必要があるため、「包括的な」ルールにしたと思います。物事は非常に複雑です。

同じ論文で、著者はこの制限を取り除くことを提案していますが、おそらく上記の理由と、初期化子が何であっても期待される動作が同じになる可能性があるため、この提案は拒否されたようです。

于 2012-07-03T00:58:00.343 に答える
5

ほかの人のため:

C ++ 17を使用すると、これは間接的に(非静的メンバータイプの自動推論)可能です。それを実現するには、テンプレートと控除ガイドを使用する必要があります。

template< class data_t>
struct MyType 
{
    data_t data;
    static constexpr auto data_size = sizeof(data_t);

    MyType( data_t && p_data ) : data(p_data) {}
};

template< class data_t>
MyType(data_t &&) -> MyType<std::remove_reference_t<data_t>>;

方法はわかりませんが、この自動メンバーは、特定のパターンがほぼ不可能である場合に、それらなしで言語に組み込む必要があります。

ラムダが参照によってクラスのメンバーをキャプチャする場合、上記のシナリオは機能しません。これは、タイプ消去された関数の使用を回避する、高度に補償可能なクラスに役立つパターンです。私が組み込みシステムで定期的に行っていること。

https://godbolt.org/z/W-K9Uk

言語をマングルして送信し、ラムダがplacement-newとoffset_ofを使用して存在しないクラスのメンバーを参照できるようにすることができますが、これはばかげているため、必須ではありません。

于 2018-09-24T05:41:30.863 に答える