2013-06-21 42 views
6

我剛剛嘗試在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是錯誤的。

+0

你使用了哪些編譯器設置? –

回答

13

根據status page for clang,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尚未實施。我也發現我們的鐺建設已經-std = C++ 1y。在關閉clang之後不再產生錯誤。 – goneskiing