2016-12-14 1 views
10
다음 코드가 실패

live on Ideone 컴파일 :는 const를 통한 constexpr 초기화 : 다른 INT 치료 더블을

#include <iostream> 
using namespace std; 

int main() { 
    const double kPi = 3.14; 
    constexpr double kPi2 = 2.0*kPi; 
    cout << kPi2; 
} 

오류 메시지는 다음과 같습니다

prog.cpp: In function 'int main()': 
prog.cpp:6:30: error: the value of 'kPi' is not usable in a constant expression 
    constexpr double kPi2 = 2.0*kPi; 
          ^
prog.cpp:5:15: note: 'kPi' was not declared 'constexpr' 
    const double kPi = 3.14; 

가에 대한 const 선언을 대체 kPiconstexpr, it compiles successfully입니다. int 대신 double로 사용되는 한편

constexprconst plays well처럼 보인다 :

#include <iostream> 
using namespace std; 

int main() { 
    const int k1 = 10; 
    constexpr int k2 = 2*k1; 
    cout << k2 << '\n'; 
    return 0; 
} 

int 할 및 doubleconstconstexpr을 초기화하는 다른 치료를 얻을?
Ideone 컴파일러의 버그입니까? 이것은 C++ 표준에서 필요합니까? 왜 그런가요?
위의 코드는 UB입니까?

P. Visual Studio 2015 C++ 컴파일러를 사용해 보았습니다. (constexprconst으로 초기화하는) 첫 번째 코드 단편을 정상적으로 컴파일합니다.

+2

[문제 1826 : 상수 식에 const를 부동 소수점 (http://stackoverflow.com을/a/30742473/1708801)에서는 부동 소수점을 다르게 처리하는 이유에 대해 몇 가지 역사를 다룹니다. 또한 [흥미로운 지원되지 않는 gcc exntension] (http://stackoverflow.com/q/32813953/1708801). –

+0

@ShafikYaghmour 감사합니다. 나는 그 지위를 upvoted. –

+0

@ ShafikYaghmour 님의 댓글은 답장으로 승격되어 받아 들여 져야합니다. – TriskalJM

답변

-3

규칙 : "constexpr은 컴파일 시간"에서 평가되어야합니다.

아래 코드 (일반적인 예)를 살펴 보겠습니다.

const double k1 = size_of_array(); 

K1은 초기화의 값이 컴파일 시간을 알 수 없습니다 만 런타임 그렇게 K1는 상수 표현하지 않습니다 때까지 초기화가 알려져, 상수이다. 결과적으로 const 변수는 constexpr이 아닙니다.

const int k1 = 10; 
    constexpr int k2 = 2*k1; 

한 가지 예외가 발생

그러나 컴파일러는이 코드를 참조하십시오. constexpr 정수 값은 템플릿 인수 및 배열 선언과 같이 const 정수가 필요한 모든 곳에서 사용할 수 있습니다.[1].

당신은 아래의 링크에서 추가 정보를 얻을 수 있습니다 :

  1. Constexpr - Generalized Constant Expressions in C++11
  2. const vs constexpr on variables | stackoverflow
  3. Difference between constexpr and const | stackoverflow
+0

이것은'const double k1 = 3.14;에 관한 것이 아니라'const double k1 = size_of_array();에 관한 질문에 대답하지 않습니다. –

+0

물론 ** double k1 = size_of_array(); **는 문제에 포함되지 않습니다. 하지만 나는 예제 ** 컴파일 시간 **과 ** 런타임 초기화 **에 const 값을 주었다. constexpr (상수 표현식)이 아닌 모든 const 변수에 대한 예제입니다. 그리고 주어진 정보 다음에 나오는이 질문에 대한 대답 : constexpr 정수 값은 템플릿 인수 나 배열 선언과 같이 const 정수가 필요한 곳이면 어디에서나 사용할 수 있습니다. [MSDN] (https://msdn.microsoft.com/en-us) /library/dn956974.aspx) – straceX

+0

이 질문은 컴파일 타임 초기화에 관한 것이므로 런타임 초기화에 대한 예제와는 아무런 관련이 없습니다. 당신의 대답은 OP의 코드가 런타임 초기화 문제와 같은 것처럼 보입니다. –

0

Shafik Yaghmour 이미 link explaining the background를 제공했다.

나는, 나는 다음과 같은 매크로를 사용하는 다른 기준을 컴파일하는 코드를 유지해야하기 때문에 :

#if __cplusplus <= 199711L // lower than C++11 
    #define MY_CONST const 
#else // C++11 and above 
    #define MY_CONST constexpr 
#endif