クラステンプレート内にネストされた構造体の非静的メンバー `sizeof`を取得することは違法ですか?

ボビーモレッティ

clang / llvm 3.6.2では、次のコードを使用してコンパイルすると、コンパイルエラーが発生しますstd=c++11

template <typename T=void>
class bar
{
public:
    struct foo
    {
        int array[10];
    };

    int baz()
    {
        return sizeof(foo::array);
    }
};

int main(void)
{
    bar<> b;
    return b.baz();
}

コマンドライン呼び出し:

$ clang++ -std=c++11 nonstatic.cpp -o nonstatic
nonstatic.cpp:12:28: error: invalid use of non-static data member 'array'
        return sizeof(foo::array);
                      ~~~~~^~~~~
nonstatic.cpp:20:14: note: in instantiation of member function
'bar<void>::baz' requested here
    return b.baz();

barのように、テンプレートではなくなった場合

class bar
{
public:
    struct foo
    {
        int array[10];
    };

    int baz()
    {
        return sizeof(foo::array);
    }
};

int main(void)
{
    bar b;
    return b.baz();
}

その後、コードはきれいにコンパイルされます。注目すべきことに、GCC5.2.1はstd=c++11。の下の両方のバージョンを受け入れますまた、arrayそれを囲むクラステンプレート本体に移動すると(ただし、テンプレートとして残す)、clangはこれを受け入れます。

標準に対して正しい動作はどれですか?これはGCC、clang、またはその両方のバグですか?

(私はcfe-usersについて同じ質問をしましたが、これまでのところ応答がありません)。

ecatmur

これは確かにclangのバグです。あなたのオペランドsizeof式であるID-発現非静的データメンバーを表すので、[expr.prim.general] / 13が成り立ちます。縮小した例を次に示します。

template<class T> struct M { int f() { return sizeof(T::x); } };
struct S { int x; };
int main() { return M<S>{}.f(); }

このバグは、テンプレートインスタンスメソッド内の未評価のコンテキストで依存型メンバーにアクセスすると発生します。未評価のコンテキストで非静的データメンバーの使用を可能にするn2253ルールのClangの実装(およびその後の改善)は、かなり壊れやすく、テンプレートとの相互作用が悪いように見えます。同様の(明確ではありますが)バグはhttp://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20151019/141535.htmlです。

これがすでにClangBugzillaに報告されているという兆候は見つかりません新しいバグを開くことをお勧めします。

状況に応じて、回避策には、静的型と値の計算をインスタンスメソッドの外に移動することが含まれる場合があります。特にbazstaticメンバー関数を作成するだけでも、clangにコードを受け入れるように説得するのに十分です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

テンプレートクラスで宣言された構造体メンバーでdecltypeが失敗する

分類Dev

GoのRevelテンプレートにネストされた構造体のスライスを渡す

分類Dev

テンプレート化されたクラスのメンバー構造体のostreamをオーバーロードする方法

分類Dev

Cのリスト内の構造体 - リンクされたリスト内に存在する構造体のメンバーを表示します

分類Dev

定義されたクラスをテンプレートパラメータ内の構造体として宣言します

分類Dev

C ++のコンストラクターを使用したテンプレート化されたtypedef構造体

分類Dev

GoのHTMLテンプレートで、構造体の任意の数のネストされた構造体スライスの範囲

分類Dev

構造体メンバーにアクセスするためのテンプレート関数

分類Dev

ネストされたテンプレートの静的メンバーを定義する方法(テンプレートクラス内のテンプレートクラス)

分類Dev

テンプレート化された親クラスで定義された構造体の初期化

分類Dev

テンプレートのgolangでネストされた構造体を反復する

分類Dev

ネストされた構造体のコンストラクタスコープを制限する

分類Dev

プライベートネスト構造体の静的メンバーを宣言/初期化します

分類Dev

XSLTテンプレートを使用してネストされたXML構造をトラバースする

分類Dev

C ++のクラステンプレートに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

分類Dev

別の構造体がメンバーとして共用体にラップされている構造体が、明示的なデフォルトコンストラクターなしでコンパイルされないのはなぜですか?

分類Dev

テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

分類Dev

テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

分類Dev

ネストされた構造体とテキスト/テンプレートパッケージを使用するときに、印刷された{}括弧を削除

分類Dev

テンプレート化されたメソッドを持つネストされた構造体が許可されていないのに、なぜ一般的なラムダが許可されるのですか?

分類Dev

テンプレート化されたメソッドを持つネストされた構造体が許可されていないのに、なぜ一般的なラムダが許可されるのですか?

分類Dev

テンプレート化されたメソッドを持つネストされた構造体が許可されていないのに、なぜ一般的なラムダが許可されるのですか?

分類Dev

このクラスのネストされたクラスでテンプレートパラメータを埋めることはできますか?

分類Dev

テンプレート化された構造体またはクラスと組み合わせた概念の正しい構文は何ですか?

分類Dev

タプル構造体でラップされた列挙型構造体バリアントのフィールドにアクセスします

分類Dev

可変個引数テンプレートパラメータで構造体を使用すると、2つのテンプレートが同時にインスタンス化されるのはなぜですか?

分類Dev

dlangテンプレートとテンプレート化されたクラス、構造体、関数の違い

Related 関連記事

  1. 1

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  2. 2

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  3. 3

    テンプレートクラスで宣言された構造体メンバーでdecltypeが失敗する

  4. 4

    GoのRevelテンプレートにネストされた構造体のスライスを渡す

  5. 5

    テンプレート化されたクラスのメンバー構造体のostreamをオーバーロードする方法

  6. 6

    Cのリスト内の構造体 - リンクされたリスト内に存在する構造体のメンバーを表示します

  7. 7

    定義されたクラスをテンプレートパラメータ内の構造体として宣言します

  8. 8

    C ++のコンストラクターを使用したテンプレート化されたtypedef構造体

  9. 9

    GoのHTMLテンプレートで、構造体の任意の数のネストされた構造体スライスの範囲

  10. 10

    構造体メンバーにアクセスするためのテンプレート関数

  11. 11

    ネストされたテンプレートの静的メンバーを定義する方法(テンプレートクラス内のテンプレートクラス)

  12. 12

    テンプレート化された親クラスで定義された構造体の初期化

  13. 13

    テンプレートのgolangでネストされた構造体を反復する

  14. 14

    ネストされた構造体のコンストラクタスコープを制限する

  15. 15

    プライベートネスト構造体の静的メンバーを宣言/初期化します

  16. 16

    XSLTテンプレートを使用してネストされたXML構造をトラバースする

  17. 17

    C ++のクラステンプレートに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

  18. 18

    別の構造体がメンバーとして共用体にラップされている構造体が、明示的なデフォルトコンストラクターなしでコンパイルされないのはなぜですか?

  19. 19

    テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

  20. 20

    テンプレートクラスの構造体を独自の構造体で使用するにはどうすればよいですか?

  21. 21

    ネストされた構造体とテキスト/テンプレートパッケージを使用するときに、印刷された{}括弧を削除

  22. 22

    テンプレート化されたメソッドを持つネストされた構造体が許可されていないのに、なぜ一般的なラムダが許可されるのですか?

  23. 23

    テンプレート化されたメソッドを持つネストされた構造体が許可されていないのに、なぜ一般的なラムダが許可されるのですか?

  24. 24

    テンプレート化されたメソッドを持つネストされた構造体が許可されていないのに、なぜ一般的なラムダが許可されるのですか?

  25. 25

    このクラスのネストされたクラスでテンプレートパラメータを埋めることはできますか?

  26. 26

    テンプレート化された構造体またはクラスと組み合わせた概念の正しい構文は何ですか?

  27. 27

    タプル構造体でラップされた列挙型構造体バリアントのフィールドにアクセスします

  28. 28

    可変個引数テンプレートパラメータで構造体を使用すると、2つのテンプレートが同時にインスタンス化されるのはなぜですか?

  29. 29

    dlangテンプレートとテンプレート化されたクラス、構造体、関数の違い

ホットタグ

アーカイブ