Мне любопытно, почему следующий код не оценивается во время компиляции:
#include <array>
#include <algorithm>
template<typename T, std::size_t N>
constexpr static unsigned long long arrayToLong(std::array<T, N> v) {
unsigned long long result = 0;
for (T i : v) {
result *= 10;
result += i;
}
return result;
}
int main()
{
constexpr int PERM_INDEX = 999999;
std::array<int, 10> digits{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < PERM_INDEX; i++)
std::next_permutation(digits.begin(), digits.end());
return (int) arrayToLong(digits);;
}
Ì будет ожидать, что он просто скомпилируется во что-то похожее на return constant
. Я понимаю, что оценка во время выполнения всегда действительна, но есть ли что-то в коде, препятствующее ее оценке во время компиляции?
Знаете ли вы какой-либо компилятор, который действительно оценивает его во время компиляции?
Посмотреть на https://godbolt.org/z/EHCTos