내 목표는 클래스 객체를 만들거나 정적 함수를 호출하지 않고 컴파일 타임에 계승의 배열을 계산하는 것입니다. 나는 두 가지 질문이컴파일 시간 배열을 컴파일 할 때 컴파일러 종속 오류
0
1
0
0
0
0
0
0
0
0
:
#include <iostream>
#include <cinttypes>
#include <array>
namespace CompileTime
{
enum {MaxFactorial = 10};
template<size_t N, size_t I = N-1>
class Factorial : public Factorial<N, I-1>
{
public:
static const uint64_t value;
};
template<size_t N>
class Factorial<N,1> : public Factorial<N, 0>
{
public:
static const uint64_t value;
};
template<size_t N>
class Factorial<N,0>
{
public:
static const uint64_t value;
static std::array<uint64_t,N> array;
};
template<size_t N>
const size_t Factorial<N,1>::value = Factorial<N,0>::array[1] = 1;
template<size_t N>
const size_t Factorial<N,0>::value = Factorial<N,0>::array[0] = 1;
template <size_t N, size_t I>
const size_t Factorial<N,I>::value = Factorial<N,0>::array[I] =
I * Factorial<N, I-1>::value;
template <size_t N>
std::array<uint64_t,N> Factorial<N, 0>::array;
template class Factorial<MaxFactorial>;
typedef Factorial<MaxFactorial> PrecomputerFactorial;
}
int main()
{
using CompileTime::PrecomputerFactorial;
for(auto x : PrecomputerFactorial::array)
std::cout << x << std::endl;
std::cout << std::endl;
}
는 GCC 5.3.0로 컴파일 프로그램 출력 제공합니다 :
0
1
2
6
24
120
720
5040
40320
362880
그리고 MSVC 2015과 여기에 최소한의 코드는 먼저, 왜 array[0]
은 1
으로 설정되었지만 두 경우 모두 0
값을 갖습니다.
template<size_t N>
const size_t Factorial<N,0>::value = Factorial<N,0>::array[0] = 1;
왜 MSVC 2015가 계산에 실패 했습니까?
어느 쪽의 질문에도 대답하지 않는 관측 : GCC 6에서는 팩토리얼이 계산되고 배열은 정적 생성 시간에 초기화되고 컴파일 타임에는 초기화되지 않습니다. 나는'constexpr'을 뿌려야한다고 생각합니다. – zwol