2017-02-09 12 views
1

このコードを検討してコンパイルすることができません私はgcc-7.0.1を使用しており、ライブの例はhereです。コール

これは標準規格によるのですか、それともバグですか?最初の行が通過している間に2行目が失敗するのは何ですか?

答えて

2

すべてconstexprの関数は、constexprと非constexpr引数の両方で有効である必要があります。つまり、constexpr関数の引数は本体内にはconstexprではありませんが、関数本体の外側にあるconstexprの場合は、関数からの復帰時には、それらに応じたcertian計算がconstexprになる可能性があります。 xx[0]constexprですが、関数内で体xxないconstexprある場合

theIntArray<xx[0]>; 

これが唯一の有効な構文です。

template < size_t NN, std::array<int,NN> const& xx > 
constexpr void test() 
{ 
    theIntArray<xx[0]>; 
} 

live example

+0

TILリテラル型にconst-referenceを追加して、ユーザー定義の非型テンプレートパラメータを模倣します。 upvoted。 – TemplateRex

1

違いは、constexpr関数のパラメータが存在しないことです。それはあなたが

constexpr auto fun(int x) { 
    constexpr y = x; 
    return y; 
} 

を行うことができない、で、どちらもあなたは、関数内で非型テンプレートパラメータとして関数のパラメータxx[0]を使用することはできません。 aa[0]の場合は、関数外で評価されるため、これは異なります。

唯一の方法は、関数パラメータを非型のテンプレートパラメータにすることです。これを行うには、@ Yakkの回答を参照してください。彼はconstexpr配列へのconst-referenceを非型テンプレートパラメータとして使用しています。