우분투 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이 잘못된 경우입니다.
어떤 컴파일러 설정을 사용하고 있습니까? –