2012-03-20 3 views
9

나는 이런 식으로 뭔가 보이는 constexpr 기능이 있습니다 GCC의 4.6.3와이 컴파일, 그러나constexpr 함수 인수가 const인지 static_assert에 알려주는 방법은 무엇입니까?

constexpr int foo(int bar) 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 

    return something_const; 
} 

을 나에게 말해 계속을 오류

: '바'는 상수 표현에 나타날 수 없습니다

나는

constexpr int foo(constexpr const int bar) 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 

    return something_const; 
} 

뭔가를 시도했지만 constexpr는 함수 인수에 사용할 수 없습니다.

바는 항상 컴파일 타임 상수라는 컴파일러에 알리는 간단한 방법이 있습니까?

+0

해당 부분을 성문화하는 것을 완전히 잊어 버렸습니다. Thanks @ Henrik – TravisG

+7

constexpr 함수는 const가 아닌 인수를 사용하여 호출 할 수 있으며 단순히 constexpr'ness를 상실합니다. –

+1

고마워, 나는 그걸 몰랐다. – TravisG

답변

16

Is there some simple way to tell the compiler that bar is always a compile time constant?

bar하면 항상 컴파일 시간 상수, 다음 함수를 작성해야 등 :

template<int bar> 
constexpr int foo() 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 
    return something_const; 
} 

이렇게, 대신 당신이 이미 작성한 것을 기록하지 않는 경우 때문에, 이 경우 함수 이 아닌 인수로도 호출되는이 될 수 있습니다. 그것은 단지 const가 아닌 인수를 전달하면 함수가 손실 될 것입니다. constexpr -ness입니다.

위의 코드에서 arbitrary_number도 상수 표현이어야하며 그렇지 않으면 컴파일되지 않습니다. 당신이 i 정확히 위의 상수 표현하지 않습니다 볼 수 있듯이

int i; 
std::cin >> i; 
foo("foo", i); 

, 그러나 그것은 여전히 ​​constexpr 기능을 사용할 수 있습니다

0

foo는 다음과 같은 방식으로 사용할 수 있습니다. constexpr 함수 (및 함수 템플릿)는 이상한 짐승입니다. foo(p, i)p이고 i도있는 경우 상수 표현식이며 이지만은 여전히 ​​일반 함수처럼 사용할 수 있습니다.

함수에 대한 인수가 항상 상수 식이기위한 것이라면 함수 인수가 아니라 템플릿 인수 여야합니다.

5

constexpr 기능 이 컴파일시에 평가 될 수 있습니다, 그것은 일반적으로 표준에 의해 강제 아니에요 (당신이 기능을 강제하는 것은 그것과 constexpr 변수를 초기화 같은 상수 표현식 내부를 사용하여 컴파일 시간에 평가할) .

또한 실제로는 constexpr 함수의 인수가 일정하지 않으므로 컴파일 할 때마다 호출 할 때마다 변경 될 수 있습니다.

해결 방법 하나의 해결 방법은 컴파일 타임 상수 (있는 것 같습니다) 인 경우 bar을 전달하기 위해 비 형식 템플릿을 사용하는 것입니다.

관련 문제