は、次のコードを考えてみましょう:定数式に式を表示できないのはなぜですか?
template<int value>
constexpr int foo = value;
template<typename... Ts>
constexpr int sum(Ts... args) {
return foo<(args + ...)>;
}
int main() {
static_assert(sum(10, 1) == 11);
}
打ち鳴らす4.0.1は私に次のエラーを与える:
main.cpp:6:17: error: non-type template argument is not a constant expression
return foo<(args + ...)>;
^~~~
これは私を驚かせました。すべての引数はコンパイル時に知られていますが、sum
はconstexpr
とマークされているため、コンパイル時にfold式を評価できない理由はありません。
当然のことながら、これはまた、同じエラーメッセージで失敗します。
constexpr int result = (args + ...); // in sum
[expr.prim.fold]
、それは非常に短いですし、唯一許さ構文について説明し、非常に有用ではありません。
clangの新しいバージョンを試しても、gccと同じ結果が得られます。
実際に許可されているかどうか
倍の表現はここでは煙草です。 – bolov
@bolov赤ちゃんを意味しますか? – Oktalist
@Oktalistはい。ありがとう、ちょうど私が探していたイディオムです。私はちょうど次善のものに行きました。 – bolov