我很好奇为什么在编译时不评估以下代码:
#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
的东西。我意识到运行时评估始终是有效的,但是代码中是否有任何内容阻止它在编译时进行评估?
您知道在编译时实际对其进行评估的任何编译器吗?