与constexpr陷入困境

时间:2013-05-14 09:32:29

标签: c++ c++11 constexpr

在使用常量初始化类时遇到了麻烦:

为什么使用指向同一类中成员的指针初始化会导致错误? 出现错误而不使用“使用”类!

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
};  

1 个答案:

答案 0 :(得分:3)

代码有效,Clang接受了;这似乎是一个g ++错误。 Use::a.a的地址是一个地址常量表达式,因为它的计算结果是具有静态存储持续时间的对象的地址,因此它可用于初始化constexpr对象。