6

定数を使用してクラスを初期化しているときに問題が発生しました。

同じクラスのメンバーへのポインターを使用した初期化でエラーが発生するのはなぜですか? クラス「Use」を使わないとエラーが出る!

class A
{   
    private:
        int a;
        const int* const aptr;

    public:
        constexpr A( int _a):
            a(_a)
           , aptr( &a)           // why aptr could not be initialized? 
    {}  
};  

class Data { } d1; 

class B
{   
    private:
        Data* dptr1;

    public:
        constexpr B(Data* _p): dptr1( _p) {}

};  

class Use 
{   
    static constexpr A a{2};   // fail! error: field initializer is not constant
    static constexpr B b{&d1}; // works
};  
4

1 に答える 1

3

コードは有効であり、Clang はそれを受け入れます。これは g++ のバグのようです。のアドレスUse::a.aはアドレス定数式です。これは、静的ストレージ期間を持つオブジェクトのアドレスに評価されるため、constexprオブジェクトの初期化に使用できます。

于 2013-06-23T21:59:57.287 に答える