2013-06-21 3 views
6

우분투 13.04에서 GCC 4.7.3 표준 라이브러리 헤더 파일과 함께 clang 3.3을 사용하여 상당히 큰 코드 본을 컴파일하려고 시도했습니다. 이 모든 것이 한 가지 문제를 제외하고는 잘 진행되었습니다. 이 코드는이 머신의 표준 우분투 clang 3.2 패키지로 이미 컴파일되어 있으므로 clang 3.3 컴파일러에서 약간의 변경이 있었다고 가정합니다. 복잡한 헤더를 사용하는 const 및 constexpr와 관련된 문제입니다. 특히 복합 형 나는 코드의 첫 번째 블록을 입력하고 그래서 컴파일러는이 진짜 그 오류를 생산 연타 결과clang 3.3 및 GCC 4.7 const v의 constexpr

constexpr double real() { return __real__ _M_value; } 

보고 내 컴파일에서 코드

#ifdef __GXX_EXPERIMENTAL_CXX0X__ 
     // _GLIBCXX_RESOLVE_LIB_DEFECTS 
     // DR 387. std::complex over-encapsulated. 
     constexpr double 
     real() { return __real__ _M_value; } 

     constexpr double 
     imag() { return __imag__ _M_value; } 
#else 
     double& 
     real() { return __real__ _M_value; } 

     const double& 
     real() const { return __real__ _M_value; } 

     double& 
     imag() { return __imag__ _M_value; } 

     const double& 
     imag() const { return __imag__ _M_value; } 
#endif 

의 다음 블록을 가지고 멤버 함수는 나는 다음 포스트 Difference between `constexpr` and `const`과 몇 가지 다른 유사한 문서를 읽을 수는 있지만 여전히 정말 확실하지 오전 한 다음

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/complex:1212:7: 
note: candidate function not viable: 'this' argument has type 'const complex<double>', 
     but method is not marked const 

     real() { return __real__ _M_value; } 

로에서 const되지 않는다 이것은 GCC 헤더 문제 또는 clang 컴파일러 문제 일 경우. 필자의 생각에 constexpr으로 표시된 멤버 함수는 컴파일러가 const로 간주해야하며 clang이 잘못된 경우입니다.

+0

어떤 컴파일러 설정을 사용하고 있습니까? –

답변

13

클램 용 status page에 따르면 N3652 Relaxing requirements on constexpr functions이 부분적으로 구현됩니다. 이 신문은 큰 변화를 가져 왔습니다. 다음 내용이 삭제되었습니다.

생성자가 아닌 정적 멤버 함수가 아닌 constexpr 지정자는 해당 멤버 함수가 const (9.3.1)로 선언됩니다.

이 변경 함수는 더 이상 const 개체를 호출 할 수 없음을 의미합니다. 또한 도서관의 해당 영역을 수정하기위한 제안 인 Fixing constexpr member functions without const을 참조하십시오.

+1

감사합니다. GCC http://gcc.gnu.org/projects/cxx1y.html의 상태 페이지는 N3652가 아직 구현되지 않았 음을 나타냅니다. 나는 또한 clang build가 이미 -std = C++ 1y를 가지고 있음을 발견했다. 스위치를 끄면 더 이상 오류가 발생하지 않습니다. – goneskiing

관련 문제