Рассмотрим следующий код:
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);
}
clang 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.
Действительно ли они разрешены или нет?