sytpb 发表于 2016-12-13 16:36

static constexpr std::array 编译通过,运行错



extern "C"{
struct HEAD_MD002_4_T         
{
    static constexpr int _h[]= {5, 6, 8, 16, 16, 11, 11, 11, 11, 11, 11, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 11, 8, 12};
    typedef std::tuple<string,string,string,int64_t,double,double,double,double> _FIELDS;
    static constexpr std::array<int,sizeof(_h)> H = {5,12,21,38,55,67,79};

    /*_HEAD_MD002_4()
    {
            std::partial_sum(std::begin(_h),std::end(_h),H.data(),[&](int x,int y){return x+y+1;});
    }*/
};
}


//使用时
for(auto& i : HEAD_MD002_4_T::H)
{
      //....
}


undefined symbol: _ZN14HEAD_MD002_4_T1HE)

编译正常,运行出错

另外一个问题是static constexpr std::array<int,sizeof(_h)> H 可不可以 利用       std::partial_sum进行初始化?




sytpb 发表于 2016-12-13 16:52

本帖最后由 sytpb 于 2016-12-13 16:59 编辑

extern "C"{
struct HEAD_MD002_4         
{
                               // 1234   5   6   7   8   910   1112131415161718192021222324252627282930313233 3435
    static constexpr int _h[]= {5, 6, 8, 16, 16, 11, 11, 11, 11, 11, 11, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 11, 8, 12};
    typedef std::tuple<string,string,string,int64_t,double,double,double,double> _FIELDS;
    static std::array<int,sizeof(_h)> H;

    HEAD_MD002_4()
    {
      std::partial_sum(std::begin(_h),std::end(_h),H.data(),[&](int x,int y){return x+y+1;});
    }
};
}
看了下,std::array 不属于literal type 所以不能定义成 constexpr .
这样也报类似错

bruceteen 发表于 2016-12-14 08:43

第一条,既然H是static constexpr,那你有没有定义它呢?
#include <array>

struct HEAD_MD002_4_T         
{
    static constexpr int _h= {5, 6, 8, 16, 16, 11, 11, 11, 11, 11, 11, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 11, 8, 12};
    static constexpr std::array<int,sizeof(_h)> H = {5,12,21,38,55,67,79};
};

constexpr int HEAD_MD002_4_T::_h;
constexpr std::array<int,sizeof(HEAD_MD002_4_T::_h)> HEAD_MD002_4_T::H;

int main( void )
{
    for(auto& i : HEAD_MD002_4_T::H)
    {
    }
}

第二条,既然是 constexpr,怎么可以用 partial_sum 更改其值?而且 sizeof(_h) 是字节数吧,应该用 std::extent;而且既然是static,为什么在构造函数中初始化它?
页: [1]
查看完整版本: static constexpr std::array 编译通过,运行错