为什么在编译时不计算? (constexpr)

时间:2018-11-11 13:24:03

标签: c++ compilation constexpr

我很好奇为什么在编译时不评估以下代码:

#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上查看

0 个答案:

没有答案