2017-10-18 8 views
11

static_castを使用してconstexprコンテキストにメンバポインタをアップキャストしてg ++に問題が発生しました。コード例を参照してください。g ++のconstexprコンテキストのメンバポインタのstatic_cast

g ++バージョン6.3および7.0でコンパイルすると、reinterpret_castが定数式ではないというコンパイルエラーが発生します。 clangバージョン4.0では何のエラーも表示されませんが、reinterpret_castがないので正しいと思います。

これはg ++またはclangのバグですか?正しい行動は何ですか?あなたのキャストを可能にし、ノート

struct Base {}; 

struct Derived : Base 
{ 
    int i; 
}; 

struct Ptr 
{ 
    constexpr Ptr(int Derived::* p) : p(static_cast<int Base::*>(p)){} 
    int Base::* p; 
}; 

constexpr Ptr constexpr_ptr(&Derived::i); 

コンパイラの出力

g++ -c -std=c++14 test.cpp 
test.cpp:17:40: in constexpr expansion of ‘Ptr(&Derived::i)’ 
test.cpp:11:41: error: a reinterpret_cast is not a constant expression 
constexpr Ptr(int Derived::* p) : p(static_cast<int Base::*>(p)){} 
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+1

これは実際にアップキャストではありません。 –

答えて

3

GCCおそらくmisapprehends [expr.static.cast]/12、その

クラスBはオリジナルメンバーが含まれている、またはベースまたはの派生クラスである場合元のメンバを含むクラス、元のメンバを指すメンバへの結果のポインタそれ以外の場合、動作は未定義です。

Baseは、実際にメンバーを含むクラスのベースであるため、動作を定義し、コンストラクタが定数式を呼び出す必要があります。

関連する問題