2017-05-07 1 views
2

에 대한 const를 매개 변수 나는 다음과 같은 코드는 컴파일되지 않는 이유에 의해 매우 혼란 스러워요 :앞으로 완벽한 일정한 평가

template <typename T, typename... Ts> 
void TEST(T&& t, Ts&&... ts) { 
    if constexpr(sizeof...(ts) > 0) { 
    TEST(std::forward<Ts>(ts)...); 
    static_assert(t == 2 , "parameter must be 2"); 
    } 
} 

template <typename... Ts> 
void VARIADIC(Ts&&... ts) { 
    TEST(std::forward<Ts>(ts)...); 
} 

int main(int argc, char* argv[]) { 
    constexpr int a1 = 2; 
    constexpr int a2 = 2; 
    VARIADIC(a1, a2); 
} 

기본적으로, 나는에 전달 된 매개 변수에 대한 몇 가지 컴파일 시간 체크를 할 노력하고 있어요 기능 VARIADIC. 그러나 컴파일러는 다음에 대해 불평 :

error: non-constant condition for static assertion 
    static_assert(t == 2 , "parameter must be 2"); 
    ^~~~~~~~~~~~~ 
error: ‘t’ is not a constant expression 

상수 지정된 파라미터 a1a2 매우 분명하고, 가변 인자에 대한 검사를 수행하는 몇 가지 방법이 있어야합니다. 그들은 상수 표현식 또는 라이브 시간으로 초기화하는 경우 변수 또는 참고 만 핵심 상수 식입니다 정의에 시작 :

+0

대문자를 모두 잃어 버릴 수 있습니까? –

+2

혼란은 무엇입니까? 엔티티는 상수 표현식의 일부로 도입 될 때만 상수 표현식으로 취급됩니다. 분명히 함수에 대한 매개 변수는 그 의미에서 상수 표현이 아닙니다. 그러나 함수 결과 *는 상수 표현이 될 수 있습니다. –

+0

오류는 비정상 값으로 호출 될 수있는 TEST 함수의 정의에 있습니다. 당신이 일정한 값으로 TEST를 호출한다는 사실은 중요하지 않습니다. –

답변

4

함수 인수 단락 2.9 [expr.const] 5.20에 따라 핵심 상수 식 없습니다 상수 표현의. 함수 인수는 분명히 어느 것도 만족시키지 못합니다.

배경은 런타임 값으로 constexpr 함수를 호출 할 수 있습니다. 변수가 함수 내에서 상수 표현식인지 여부를 결정하기 위해 실제로 상수 표현식으로 호출되는지 여부는 중요하지 않습니다. 함수가 평가 될 때 호출이 상수 표현식인지 여부는 중요합니다. 인수가 함수 내에서 상수 표현식처럼 작동하지 않지만 결과는 여전히 상수 표현식이 될 수 있습니다.