1

これがコードの一部です:

class Class
{
    static constexpr int getBug();
};

constexpr int Class::getBug()
{
    return 0;
}

私が基本的に行うことはstatic constepxr、クラス宣言でメソッドを宣言し、それを実装することです。

元のコードは2つのファイルに分割され、必要なコードのみを残して、削除されたメソッド/属性がさらに含まれていました。

コードをコンパイルすると、GCC4.6.0から次のエラーが発生します。

Class.cpp:6:29: internal compiler error: in merge_types, at cp/typeck.c:825
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
  1. これは本当にバグですか?

  2. その場合、レポートに何を提供する必要がありますか?


オンラインのC++0xコンパイラでコードをテストしたところ、次のエラーが発生しました。

prog.cpp:3:33: error: the 'constexpr' specifier cannot be used in a function declaration that is not a definition
prog.cpp:6:29: error: a constexpr function cannot be defined outside of its class

このコンパイラはGCC4.5.1を使用します。コードの形式が正しくないことを知らせてくれましたが、さらに質問があります。

  1. GCC 4.5.1でエラーが発生し、GCC 4.6.0でバグが報告されるのはなぜですか?

最後の段落を書いた後、GCC 4.6.0でstaticキーワードを削除してテストし直したところ、別の実装が警告なしにコンパイルされました。

  1. 同じファミリの2つのコンパイラがこれほど異なる動作をするのはなぜですか?

メソッドは、GCC4.5.1エラー報告を説明する可能性のあるとはconstexpr異なるステートメントを回避する必要があることを知っています。return私のメソッドはマクロ条件を使用して適切な(定数)値を返すため、(通常の推奨事項に加えて)分離された実装を使用する理由を説明する数行が必要です。


私の構成:

Mac OS X.7
GCC 4.6.0
Target: x86_64-apple-darwin10.7.0
Configured with: ./configure
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.7.0' '-v' '-save-temps' '-std=c++0x' '-c' '-shared-libgcc' '-mtune=core2'
4

1 に答える 1

5

これは、がこのconstexpr言語の新機能であり、GCCページのC ++ 0xサポートによると、この機能のサポートが4.6で最初にGCCに追加されたためです。私の疑惑は、それが実際にはコンパイラのバグであり、4.6.1以降で修正される可能性があるということです。

GCC 4.5.2は、そのバージョンで機能がまだ利用できないため、エラーを生成します。実際、4.5.2の標準ライブラリヘッダーを確認すると、すべてのconstexprメソッド(標準で指定されている)が「Needsconstexpr」のようになっていることがわかります。

于 2011-10-09T01:01:06.780 に答える