2013-06-21 15 views
6

私は、clang 3.3を使ってかなり大きなコードをUbuntu 13.04のGCC 4.7.3標準ライブラリヘッダーファイルでコンパイルしようとしました。これはすべて1つの問題を除いてうまくいった。このコードはすでにこのマシン上の標準のUbuntu 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が部分的に実装されています。この論文は大きな変化をもたらしました。次の節が削除されました。

コンストラクタメンバ関数は、(9.3.1)CONSTであることをことを宣言しない非静的メンバ関数のconstexprの指定子。

この変更は、あなたの関数がconstオブジェクトでもう呼び出せないことを意味します。また、図書館のこれらの領域を修正する提案であるFixing constexpr member functions without constを参照してください。

+1

ありがとうございます。 GCC http://gcc.gnu.org/projects/cxx1y.htmlのステータスページは、N3652がまだ実装されていないことを示しています。私も、clangのビルドに-std = C++ 1yが既にあることを発見しました。それを切った後、clangはもはやエラーを生成しません。 – goneskiing

関連する問題