我们应该在任何地方使用constexpr吗?

R. *_*des 25 c++ constexpr c++11

我们显然无法做到一切constexpr.如果我们什么都不做constexpr,那就不会有任何大问题.到目前为止,很多代码都没有编写.

但是打constexpr一些可能有它的东西是个好主意吗?这有什么潜在的问题吗?

Jer*_*fin 14

它不会打扰编译器.如果您在不符合要求的代码上使用它,编译器将(或者应该)给出诊断constexpr.

与此同时,我有点犹豫,因为你可以在那里拍打它.尽管它不会/不会打扰编译器,但您的主要受众是其他阅读代码.至少IMO,你应该用它constexpr来传达一个相当具体的含义,然后把它放在其他表达式上,因为你可能会产生误导.我认为读者想知道一个被标记为a constexpr但仅用作正常运行时函数的函数会发生什么事情是公平的.

同时,如果您有诚实的功能预计在编译时使用,而你只是还没有使用它的方式,将其标记为constexpr可能使相当多的感觉.

  • 等等,所以这是编译器可以为自己派生的属性?那为什么会有关键字呢? (3认同)
  • @Nemo 当您错误地声明不满足所有要求的 `constexpr` 时,编译器需要发出诊断信息。因此,关键字*至少*对于作者积极断言声明的函数或构造函数满足这些要求很有用。我让另一个问题打开(如果编译器可以处理它,则隐式地允许在常量上下文中没有标记为 `constexpr` 的东西)。 (2认同)

Luc*_*ton 8

为什么我懒得尝试constexpr以列表形式抓住每个机会,并且没有特别的顺序:

  • 我不经常编写单行函数
  • 当我写一个单行时,它通常委托给一个非constexpr函数(例如std::get最近出现了几次)
  • 他们操作的类型并不总是文字类型; 是的,引用是文字类型,但如果引用的类型本身不是文字,我无论如何都不能在编译时真正拥有任何实例
  • 他们返回的类型并不总是字面意思
  • 就语义而言,它们在编译时并不是全部有用甚至是有意义的
  • 我喜欢将实现与声明分开

Constexpr功能有很多限制,它们只是特殊用途的利基.通常不是优化或理想的超级功能集.当我写一个,它往往是因为元函数或单独常规功能不会削减它,我有这方面的特殊心态.Constexpr功能不味道像其他功能.

我对constexpr构造函数没有特别的意见或建议,因为我不确定我是否可以完全理解它们并且用户定义的文字尚不可用.


vox*_*oid 6

我倾向于同意 Scott Meyers 的观​​点(对于大多数事情):“constexpr尽可能使用”(来自《Effective Modern C++ 》第 15 条),特别是当您提供 API 供其他人使用时。当您希望使用函数执行编译时初始化,但由于库没有声明它而无法执行时,这可能会非常令人失望constexpr。此外,所有类和函数都是 API 的一部分,无论是由全世界使用还是仅由您的团队使用。因此,尽可能使用它,以扩大其使用范围。

// Free cup of coffee to the API author, for using constexpr
// on Rect3 ctor, Point3 ctor, and Point3::operator*
constexpr Rect3 IdealSensorBounds = Rect3(Point3::Zero, MaxSensorRange * 0.8);
Run Code Online (Sandbox Code Playgroud)

也就是说,它constexpr是接口的一部分,因此,如果接口不自然地适合某些可以的东西constexpr,请不要承诺它,以免以后不得不破坏 API。也就是说,不要constexpr仅仅因为当前唯一的实现可以处理它而承诺该接口。