2013-05-14 47 views
6

麻烦我遇到了麻烦,同时初始化与常量类:运行与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 
}; 
+0

@Morwenn:在构建'aptr'时,'a'已经构建并且具有有效地址。 – Mankarse 2013-05-14 09:36:04

+0

我使用g ++初始化''Use'的'A'和'B' outisde,你会得到'抱歉,未实现:使用常量表达式中构造的对象的值'。 – Morwenn 2013-05-14 09:45:31

+0

我认为你在这里有一个错字或UB:你正在取一个函数参数的地址,在'A'的Ctor结束后不再存在。也许你想'constexpr A(int&_a)'? – dyp 2013-05-14 11:09:43

回答

3

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

+0

我认为你的意思是gcc.gnu.org/PR57694 – 2013-06-30 20:10:38

+0

对不起,你是对的。错误报告是http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 – Klaus 2013-07-03 12:58:34