2014-04-13 3 views
8

static이 아닌 constexpr 속성을 사용하여 struct의 멤버를 만들려고하면 컴파일러 오류가 발생합니다 (아래 참조). 왜 그런가요? 단일 상수 값에 대해 구조체의 범위 대신 프로그램이 종료 될 때까지이 값을 메모리에 저장합니까? 매크로를 사용하려면 다시해야합니까?왜 constexpr은 정적이어야합니까?

struct foo 
{ 
    constexpr int n = 10; 
    // ... 
}; 

error: non-static data member cannot be constexpr; did you intend to make it static? 
+0

음, 복사하는 것이별로 의미가 없을 것입니다. – Ben

+1

구조체의 각 인스턴스마다 하나씩 여러 번보다 정적 메모리에서 훨씬 좋습니다. – chris

+2

왜 각 객체에 대해'constexpr'의 복사본을 가지고 있습니까? –

답변

12

나는 공식적인 이성을 알지 못합니다. 그러나 분명히 그것은 혼란을 가져올 수 있습니다. 나는 비 정적 데이터 멤버가 constexpr 인 것을 의미하는 것을 볼 수 없다. 당신은 다음을 할 수 있습니까?

struct foo { 
    constexpr int n = 10; 
    constexpr foo() { } 
    constexpr foo(int n):n(n) { } // overwrite value of n 
}; 

아니면이 초기화가 항상 일정해야한다는 것을 의미합니까, 당신은 (n이 일정하지 않기 때문에/잠재적으로 상수가 아닌 수)하지만

foo f = { 10 }; 
말할 수 위를 작성할 수 없습니다 즉,

암시 적으로 static이 아니라 단순히 constexpr int n이라는 규칙은 그 의미가 명확하지 않으므로 나에게 좋을 것 같습니다.

+0

정수형이므로'constexpr int n = 10'에 아무런 문제가 없습니다. 컴파일하는 동안'n'을 사용할 때마다'define'과 마찬가지로 값으로 대체해야합니다. 문법은 매우 명확합니다. 왜 표준이 그것을 허용하지 않는지 이해하지 못합니다. –

관련 문제