2017-04-21 9 views
4

비 const 참조를 constexpr으로 선언 할 수 있습니까? 예제 코드 : 이것은 GCC와 그 소리에 의해 허용되는비 const 오브젝트에 대한 constexpr 참조

int x = 1; 
constexpr int& r = x; 

은 (내가 다시 C++ 11 두의 몇 가지 현재와 과거의 버전을 시도하고, 모두가 그것을 가능). 그러나 나는 C++ 14 dcl.constexpr/9] 말한다 때문이 허용되지해야한다고 생각 :

constexpr 지정자 참조 선언에 사용되는 경우, 그 이니셜에 나타나는 모든 풀 표현하여야한다 상수 표현이 되라.

그리고 x는 상수의 표현이 아니다.

[dcl.constexpr]의 최신 C++ 17 초안의 언어가 바뀌었고 더 이상 명시 적으로 constexpr 참조를 언급하지 않았습니다. 나는 그것에 대해 말하려고하는 것의 머리도 꼬리도 만들 수 없습니다. .

+1

누가'x'가 상수 표현이 아니라고 말 했나요? –

+0

"'x '는 핵심 상수 표현이 아닙니다. {{{필요한 인용}} –

+0

@ T.C. [expr.const]/2 "e"는 'e'의 평가가 다음 중 하나를 평가하지 않는 한 핵심 상수 표현식입니다 : [...] 좌변 - 우변 변환, [사례 이 코드는 일치하지 않습니다] " –

답변

4

x에 정적 저장 기간이 있다고 가정하면 lvalue 표현식 x은 완전히 유효한 상수 표현식입니다.

왼쪽 값과 오른쪽 값 변환이 적용되는 prvalue가 필요한 컨텍스트에서 x을 사용하는 경우 결과 값인 prvalue - TO_RVALUE(x)이라고 함 -은 명백한 이유로 상수 표현이 아닙니다. 원인. 그러나 참조 바인딩의 경우에는 그러한 변환이 없습니다.

+0

이니셜 라이저에 따라 다릅니 까? –

+0

@ M.M 번호 (예.) 좌변 상수 표현은 엔티티를 지정하기 만합니다 (기본적으로 주소와 비슷합니다). 그것으로 초기화되는 것은 무의미하며, 컴파일러가 알 필요조차 없다 (extern int x; 충분하다). –