템플릿 메타 프로그래밍을 파고 C++에서 enum의 범위와 함께 이상한 동작을 발견했습니다. 나는 경고를받습니다 : 표현식이 인 정수 오버플로입니다. 실제로 열거 형 범위를 벗어나는 값을 원하지 않는 것처럼 보입니다.템플릿 클래스에있을 때 enum에 정수 오버플로가 발생했습니다.
#include <iostream>
#include <limits>
template <int i>
class pow {
public:
enum { result = 2*pow<i-1>::result};
};
template<>
class pow<0> {
public:
enum { result = 1};
};
enum test { one, max = 4294967295 };
enum test_2 { last = 4294967295*2 };
int main() {
std::cout << "pow<2>: \t" << pow<2>::result << std::endl;
std::cout << "pow<4>: \t" << pow<4>::result << std::endl;
std::cout << "pow<30>: \t" << pow<30>::result << std::endl;
std::cout << "pow<31>: \t" << pow<31>::result << std::endl;
std::cout << "max test: \t" <<
std::numeric_limits<std::underlying_type<test>::type>::max() << std::endl;
std::cout << "max test_2: \t" <<
std::numeric_limits<std::underlying_type<test_2>::type>::max() << std::endl;
return 0;
}
컴파일 출력 : 여기에 코드입니다
test.cpp:7:19: warning: integer overflow in expression [-Woverflow]
enum { result = 2*pow<i-1>::result};
^
test.cpp:7:7: warning: overflow in constant expression [-fpermissive]
enum { result = 2*pow<i-1>::result};
프로그램 출력 :
pow<2>: 4
pow<4>: 16
pow<30>: 1073741824
pow<31>: -2147483648
max test: 4294967295
max test_2: 18446744073709551615
이 클래스 펑의 열거가 작은 범위를 가지고 왜? 내가 아는 한, 모든 'i'값에 대해 인스턴스화 된 다른 클래스가 있으므로 별도의 enum 형식이 있습니다. 결과적으로 'i'> 31의 경우 enum은 test_2와 같이 64 비트 여야합니다. 내가 틀린 곳?
나는 gcc 4.8과 gcc 5.4를 시도했고 그 결과는 같다.
C++ 11을 사용하는 경우'enum' 대신'static constexpr' 변수를 사용하거나 다음과 같이 열거 형을 지정할 수 있습니다 :'enum : long int {...};' – Nelfeal