我剛剛嘗試在Ubuntu 13.04上使用clang 3.3和GCC 4.7.3標準庫頭文件編譯相當大的代碼體。除了一個問題,這一切都進展順利。這段代碼已經在這臺機器上用標準的Ubuntu clang 3.2包進行編譯,所以我認爲這是clang 3.3編譯器的一些變化。這個問題與使用複雜頭文件的const和constexpr有關。尤其是複合型具有的代碼clang 3.3和GCC 4.7 const v的constexpr
#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
以下塊在我編譯我進入第一個代碼塊,因此編譯器看到
constexpr double real() { return __real__ _M_value; }
這導致鐺產生誤差,真正的成員函數不與下面
/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我看了下面的帖子Difference between `constexpr` and `const`和其他一些類似的文件,但我還沒有真正明確如果這是GCC頭部問題或鐺聲編譯器問題。我的感覺是,標記爲constexpr的成員函數應該被編譯器視爲const,在這種情況下,clang是錯誤的。
你使用了哪些編譯器設置? –