16

gcc 5.0 は次のコードを拒否し、clang 3.6 はそれを受け入れることに気付きました。

template<int n>
struct I
{
    typedef int Type;
};

template<typename T>
struct A
{
    typedef I<sizeof(sizeof(T))>::Type Type;
};

2 つのコンパイラsizeof(sizeof(T))は、式が型依存か値依存かによって異なるようです。式が従属型である場合I<sizeof(sizeof(T))>は、従属型であるということになります。つまり、必須であるtypename必要があります。

これは、C++11 標準の次の文言でカバーされています。

[温度依存タイプ]/8

ある場合、型は従属です。

  • テンプレート名がテンプレート パラメータであるか、いずれかのテンプレート引数が依存型または型依存または値依存の式である simple-template-id

[温度.dep.expr]/4

次の形式の式は型に依存しません (式の型は依存できないため)。

sizeof unary-expression
sizeof ( type-id )

[temp.dep.constexpr]/2

次の形式の式は、una​​ry-expression または expression が typedependent であるか、type-id が依存している場合、value-dependent です。

sizeof unary-expression
sizeof ( type-id )

私の解釈では、それsizeof(T)は型に依存するsizeof(sizeof(T))ことはありません。つまり、型に依存したり、値に依存したりすることはできません。

これは gcc のバグですか?

4

1 に答える 1

7

N4296以降のドラフトを使用しています。

typedef I<sizeof(sizeof(T))>::Type Type;

typenameネストされた名前指定子 I<..>がテンプレート パラメーター [temp.res]/5 に依存する場合は必須です。それで、I<..>依存していますか?

[temp.dep.type]/9 次の場合、型は依存型です。

  • [...]
  • (9.7)テンプレート名がテンプレート パラメータであるか、いずれかのテンプレート引数が依存型または型依存または値依存の式であるsimple-template-id、または [...]

I<..>simple-template-idで、テンプレート引数は式です。この式はsizeof(sizeof(T))型依存ですか、それとも値依存ですか?

この式sizeof(sizeof(T))は、次の式に分解できます。

表現形式
===============================================
              T       type-id 
       sizeof(T) sizeof ( type-id )
      (sizeof(T)) ()
sizeof(sizeof(T)) sizeof単項式

Tは式ではありませんが、リストに残しておきます。括弧に関する注意: primary-expressionは、括弧で囲まれた (一般的な) expressionにすることができます。単項式は、一次式にすることができる後置式することができるため、括弧で囲むこともできます。

かっこで囲まれた式(X)は、依存している場合Xに依存しています。

[temp.dep.expr]/1 以下で説明する場合を除き、部分式が型依存である場合、式は型依存です。

[temp.dep.constexpr]/1 以下で説明する場合を除き、定数式は値依存の部分式がある場合、値依存です。

一般に、sizeof式は常に type の値を生成するため、に依存することはありませんstd::size_t

[temp.dep.expr]/4 次の形式の式は型に依存しません(式の型は依存できないため)。

[...]
sizeof unary-expression
sizeof ( type-id )

ただし、それらが生成する値は、テンプレート パラメーターに依存する場合があります。

[temp.dep.constexpr]/2 次の形式の式は、una​​ry -expressionまたはexpressionが type-dependent であるか、type-idがdependentである場合、値に依存します。

sizeof unary-expression
sizeof ( type-id )
表現形式 value-dep? タイプ依存?
================================================== =====================
              T       type-id                    いいえ はい
       sizeof(T) sizeof ( type-id ) はい いいえ
      (sizeof(T)) () はい いいえ
sizeof(sizeof(T)) sizeof単項式    no no

Tに依存するためsizeof(T)に依存します。ただし、(sizeof(T))依存でsizeof(sizeof(T))はないため、まったく依存しません。

于 2014-12-30T22:39:34.907 に答える