Я возился с SVN-сборкой clang, чтобы экспериментировать с непринужденными правилами для constexpr
. Одной из вещей, которые мне пока не удалось определить, является возможность циклического прохождения элементов внутри кортежа во время компиляции в функции constexpr.
Поскольку у меня нет стандартной библиотеки, совместимой с С++ 14 для тестирования, я подготовил следующий эквивалентный тест:
template<int N>
constexpr int foo() {
return N;
}
constexpr int getSum() {
auto sum = 0;
for (auto i = 0; i < 10; ++i) {
sum += foo<i>();
}
return sum;
}
constexpr auto sum = getSum();
Интересная часть здесь foo<i>()
. В функции, отличной от constexpr, я ожидал бы, что это не скомпилируется, потому что вы просто не можете использовать runtime int для создания экземпляра шаблона во время компиляции. Однако, поскольку это функция constexpr
, я задаюсь вопросом, возможно ли это. В частности, значение известно во время компиляции, даже если ему разрешено мутировать.
Я знаю, что следующий код будет скомпилирован:
constexpr auto nValue = 2;
foo<nValue>();
В SVN clang мой первый пример не делает:
test2.cpp:19:12: error: no matching function for call to 'foo' sum += foo(); ^~~~~~ test2.cpp:11:15: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'N' constexpr int foo() { ^
Во-первых, я пытаюсь интерпретировать вторую часть этого сообщения об ошибке. В стороне, это предусмотрено стандартом С++ 14, и если да, то кто-нибудь знает, почему этот синтаксис не будет разрешен (простой надзор или защита от чего-то)?