2

非型テンプレート引数に関する記事を読んでいたところ、次のように書かれてい

ました。これは100、コンパイルされた時定数式であるため、 100+991<<3などが許可されることを意味します。のような関数呼び出しを伴う引数abs(-120)は使用できません。

例 :

template<class T, int SIZE>
class Array{};

int main(){
Array<int, 100+99> my_array; // allowed
Array<int, abs(-120)> my_array; // not allowed
}

100+99 と abs(-120) の違いは何ですか?
100+99 がコンパイル時間で、abs(-120) がそうではないのはなぜですか?

4

2 に答える 2

4

なしabs(-120)。C++11 では完全に合法です。あなたが適切に指摘したように、C++03にはコンパイル時に評価できる関数のスコープがありませんでしたが、C++11にはあります。直接の場合、同じ計算を実行して C++03absで使用するテンプレートに置き換えることができます。abs_template<-120>::value

編集: たとえabsが でなくてもconstexpr、 である を自分absで簡単に書くことができると言いたかったのですconstexpr。私はそれを編集したと誓った.

于 2012-07-01T15:25:16.957 に答える
3

100+99199コンパイル時に最適化されます。

abs()関数であり、マークされている場合とマークされていない場合がありますconstexpr(C++ 11の機能により、マークを付けることができます。cppreferenceまたは標準を簡単にチェックしてconstexpr、C ++ 11にあるかどうかを確認できます)。実行する必要があります。コンパイラは、同じ引数で実行するたびに同じ値を返すステートレス関数であると推測できません。

于 2012-07-01T15:25:08.843 に答える