编译时评估函数以计算常量

时间:2017-01-01 01:17:18

标签: c++ const constexpr

序言:我看过constexpr initializing static member using static function,但是(感谢Oleg Bogdanov的回答)我并没有尝试初始化静态。

我想知道如何进行以下工作:

typedef uint32_t color_t;       // represent color as 00rrggbb

class Color {
  static color_t makeColor(const uint8_t r,
                           const uint8_t g,
                           const uint8_t b) {
    return (((color_t)r << 16) | ((color_t)g << 8) | (color_t)b);
  }  
  static const color_t kRed = makeColor(255, 0, 0);
}

在我看来,需要告诉编译器它可以在编译时评估makeColor(),所以我认为这是constexpr的工作。尽管我尽最大努力在constexprconst附近洒水,但我还是得到了

error: field initializer is not constant

我错过了什么?

P.S。:我当然可以用#define完成我想要的东西:

#define makeColor(r, g, b) (((color_t)(r) << 16) | ((color_t)(g) << 8) | (color_t)(b))

......但这似乎是20世纪!

1 个答案:

答案 0 :(得分:2)

实际上你非常接近你的目标,如果你从makeColor删除static,那么kRed constexpr就足够了

Demo

this answer

中解释了为什么static确实存在问题