c++ - 计算常量的函数的编译时评估

标签 c++ constants 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 世纪的事!

最佳答案

实际上,您已经非常接近您的目标,如果您从 kRed 中删除 static,则制作 makeColor constexpr 就足够了

Demo

为什么 static 是有问题的在 this answer 中有解释。

关于c++ - 计算常量的函数的编译时评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41412735/

相关文章:

c++ - 使用 QtPlugin 部署 Qt 控制台应用程序

c++ - 用于迭代多重映射的某些元素的设计运算符++

ios - 将不同的发射器分配给随机的不同节点

c++ - 将 C++11 initializer_list 与使用 constexpr 的递归定义类型一起使用

c++ - 是否可以为 constexpr 函数定义类型别名

c++ - 使用 std::vector 类构造函数对 C 数组进行 Constexpr 包装

c++ - 是依赖类型依赖的非静态数据成员的非限定名称

C++ 返回字符串导致 free() : invalid pointer error

c# - 为什么 C# 没有为变量和方法设计 'const'?

ios - 如何在 Swift 中声明一个可以被多个 View Controller 访问的常量?