可変長でないテンプレート関数では以下のような単純計算の場合、コンパイル時に計算をして実行時に定数として利用できました。
しかしこの関数を可変長で表現した結果、「式は定数に評価されませんでした」というエラーがでてしまいました。
引数の展開というものは、実行時にしか行えないものなのでしょうか?
Cpp
1#include <iostream> 2 3// 与えられた引数の値の合計値を渡す 4template <typename First, typename... Rest> 5constexpr auto sum(First first, const Rest&&... rest) 6{ 7 for (auto&& n : { rest... }) { 8 first += n; 9 } 10 return first; 11} 12//template <typename T> 13//constexpr auto sum(const T&& a, const T&& b, const T&& c, const T&& d, const T&& e, const T&& f) 14//{ 15// return a + b + c + d + e + f; 16//} 17 18int main() { 19 constexpr int test = sum( 1, 1, 4, 5, 1, 4 ); 20 std::cout << test << std::endl; 21 22 return 0; 23}
お使いのコンパイラはMicrosoft Visual C++でしょうか?バージョン番号を明記されたほうがよいですね。
これは失礼しました。
VisualStudio2019 16.0.28803.156の恐らく最新版と思われるのですが、コンパイラだけ古いということがあるのでしょうか。
ビルド時のエラーでは、
「期限切れの変数の読み取りによってエラーが発生しました」
「'$S3'の使用量を参照してください」
というものも出ております。
https://gcc.godbolt.org/z/inb7O4 Visual Studio 2019 (_MSC_VER=1920)では正常にコンパイルできますねぇ...