30

我们显然不能做所有事情constexpr。如果我们不做任何事情constexpr,那么,不会有任何大问题。到目前为止,已经编写了很多没有它的代码。

constexpr但是,在任何可能拥有它的东西上拍打是个好主意吗?这有什么潜在的问题吗?

4

4 回答 4

15

它不会打扰编译器。当/如果您在不符合constexpr.

同时,我会有点犹豫,因为你可以。尽管它不会/不会打扰编译器,但您的主要受众是其他阅读代码的人。至少在 IMO,你应该用它constexpr来向他们传达一个相当具体的含义,并且只是将它贴在其他表达上,因为你可能会产生误导。我认为读者应该想知道标记为 a 的函数发生了什么constexpr,但仅用作正常的运行时函数。

同时,如果您确实希望在编译时使用一个函数,而您还没有以这种方式使用它,那么将其标记constexpr可能更有意义。

于 2011-07-22T03:33:58.720 回答
8

为什么我不费心尝试constexpr以列表形式列出每个机会,并且没有特定的顺序:

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

Consexpr 函数有很多限制,以至于它们只适合特殊用途。通常不是优化,也不是理想的功能超集。当我一个时,通常是因为单独的元函数或常规函数不会削减它,而且我对它有一种特殊的心态。constexpr 函数的味道不像其他函数。

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

于 2011-07-22T03:32:32.843 回答
0

的。我相信const无论何时何地,都将这种做法放在首位。例如,class如果给定的方法没有修改任何成员,那么您总是倾向于const在最后放置一个关键字。

除了语言方面,提及const性也是对未来程序员/审阅者的一个很好的指示,即表达式在该区域内具有 const-ness。它与良好的编码实践有关,也增加了可读性。例如(来自@Luc)

constexpr int& f(int& i) { return get(i); }

现在 putconstexpr表明它get()也必须是一个constexpr.

我没有看到任何问题或暗示constexpr

编辑:还有一个额外的好处是您可以在某些情况下constexpr将它们用作参数。template

于 2011-07-22T03:46:00.360 回答
0

I tend to agree with Scott Meyers on this (as for most things): "Use constexpr whenever possible" (from Item 15 of Effective Modern C++), particularly if you are providing an API for others to use. It can be really disappointing when you wish to perform a compile-time initialization using a function, but can't because the library did not declare it constexpr. Furthermore, all classes and functions are part of an API, whether used by the world or just your team. So use it whenever you can, to widen its scope of usage.

// 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);

That said, constexpr is part of the interface, so if the interface does not naturally fit something that can be constexpr, don't commit to it, lest you have to break the API later. That is, don't commit constexpr to the interface just because the current, only implementation can handle it.

于 2019-09-29T00:18:33.790 回答