일단 변수가 컴파일 타임이다 아니다라는 표현이 좀 이상함


이게 기계어로 변환되었을때 무조건 literal로만 표현되어야 한다는 얘기라면 이건 C++ 표준이랑 상관 없음


그게 아니라 초기화 얘기라면


constexpr variable must satisfy the following requirements:

...


이 말이 초기화 expression이 컴파일 타임이어야 한다는 얘기임



실제로


constexpr int f( int n ) { return n + 1; }


요런 constexpr 함수가 있을때


constexpr int n = f( 1 ); <- 컴파일 됨


int* _n = new int{};

constexpr int n = f( *_n ); <- 컴파일 안됨



그리고 이런 것도 되야됨


if constexpr ( n > 0 );


SomeStructTemplate< n >{};



정리하면 constexpr variable은

1. 초기화: 컴파일 타임 (constexpr 함수가 초기화 expression에 쓰이면 컴파일 타임 계산을 보장함 아니면 컴파일 안됨)

2. 컴파일 타임 evaluation을 요구하는 곳에 쓸수 있음 (if constexpr, template)

3. (기계어로 컴파일됐을때) 피연산자로 쓰일때 주소값을 갖을수는 있음 <- c++ 표준이 관여할 사안이 아님