Почему это не вычисляется во время компиляции? (Constexpr) - PullRequest
0 голосов
/ 11 ноября 2018

Мне любопытно, почему следующий код не оценивается во время компиляции:

#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

...