2012-07-01 3 views
2

형식이 아닌 템플릿 인수에 대한 기사를 읽었으며 그 내용은 다음과 같습니다.


컴파일시 정수를 전달할 수 있습니다. 즉, 컴파일 된시 간수 표현이므로 100, 100+99, 1<<3 등이 허용됩니다. abs(-120)과 같은 함수 호출과 관련된 인수는 허용되지 않습니다.

형식이 아닌 템플릿 인수

예 :

template<class T, int SIZE> 
class Array{}; 

int main(){ 
Array<int, 100+99> my_array; // allowed 
Array<int, abs(-120)> my_array; // not allowed 
} 

무엇 100 + 99과 ABS (-120)의 차이?
어떻게 100 + 99 컴파일 된 시간과 abs (-120)되지 않습니다?

+0

정수 리터럴이 객체로 간주되는지 의심 스럽습니다. 그렇다면 연산자 오버로딩 개념을 사용할 수없는 곳에서'C'가 어떻게했는지 궁금합니다. – Mahesh

+0

C++이 순수한 OO 언어 인 경우, 그렇습니다. 그러나 그렇지 않습니다. 계속해서'100.operator + (99)'를 시도하고 무슨 일이 일어나는 지보십시오. –

+0

컴파일 타임에 어떤 식을 의미있게 평가할 수 있는지 선택하는 것은 어느 시점에서 필연적 일 수 있습니다. C++은 이것을 보수적으로 선택하기 때문에 대부분 사소한 표현식, 템플릿 또는 "안전하다"는 것을 알 수 있습니다. 예 : 컴파일러가 어떻게'printf ("")'를 컴파일 할 때 평가할 수 있는지 알 수 있습니까? – millimoose

답변

3

100+99은 컴파일시에 199으로 최적화되었습니다.

abs() 기능이며 또는 constexpr 표시되지 않을 수도 있습니다 (당신이 그렇게 할 수 있도록 할 C++ 11 기능을, 당신은 쉽게는 C++ 11 constexpr를 어떤지를 확인 cppreference 또는 표준을 확인할 수 있습니다). 실행해야합니다. 컴파일러는 같은 인수로 모든 실행에 대해 동일한 값을 반환하는 함수가 더 적다는 것을 추론 할 수 없습니다.

+1

표준'abs'가'constexpr'으로 표시되지 않으면'constexpr '일 수있는 자신 만의'abs'를 작성할 수 있습니다. – Puppy

+0

분명히 libstdC++에는 constexpr abs가 있습니다. gcc 4.6의 비 유형 템플릿 인자로'std :: abs (-120)'을 사용할 수 있습니다. – mfontanini

+0

@mfontanini, 따라서 "내 표시가 될 수도 있고 표시되지 않을 수도 있습니다."; 나는 표준이 그것을 보장하는지 여부를 모른다. – Griwes

4

없음 및 abs(-120)은 C++ 11에서 완전히 합법적입니다. C++ 03은 적절하게 지적했듯이 컴파일 타임에 평가할 수있는 함수의 범위가 없지만 C++ 11에서는 그렇습니다. abs의 경우 직접 동일한 계산을 수행하는 템플릿으로 바꾸고 C++ 03에서 abs_template<-120>::value을 사용할 수 있습니다.

편집 : absconstexpr이 아니더라도 쉽게 absconstexpr을 작성할 수 있습니다. 나는 그것을 편집했다는 것을 알았습니다.

+1

'abs'는 C++ 11에서'constexpr'로 정의 되었습니까? – Nawaz

+0

'std :: abs'는 내가 볼 수있는 한'constexpr'로 정의되지 않았습니다. – interjay

+0

아니,하지만 도대체, 5 득표 ... –

관련 문제