我们显然不能做所有事情constexpr
。如果我们不做任何事情constexpr
,那么,不会有任何大问题。到目前为止,已经编写了很多没有它的代码。
constexpr
但是,在任何可能拥有它的东西上拍打是个好主意吗?这有什么潜在的问题吗?
它不会打扰编译器。当/如果您在不符合constexpr
.
同时,我会有点犹豫,因为你可以。尽管它不会/不会打扰编译器,但您的主要受众是其他阅读代码的人。至少在 IMO,你应该用它constexpr
来向他们传达一个相当具体的含义,并且只是将它贴在其他表达上,因为你可能会产生误导。我认为读者应该想知道标记为 a 的函数发生了什么constexpr
,但仅用作正常的运行时函数。
同时,如果您确实希望在编译时使用一个函数,而您还没有以这种方式使用它,那么将其标记为constexpr
可能更有意义。
为什么我不费心尝试constexpr
以列表形式列出每个机会,并且没有特定的顺序:
std::get
最近出现了好几次)Consexpr 函数有很多限制,以至于它们只适合特殊用途。通常不是优化,也不是理想的功能超集。当我写一个时,通常是因为单独的元函数或常规函数不会削减它,而且我对它有一种特殊的心态。constexpr 函数的味道不像其他函数。
我对构造函数没有特别的意见或建议,constexpr
因为我不确定我能否完全理解它们,而且用户定义的文字尚不可用。
是的。我相信const
无论何时何地,都将这种做法放在首位。例如,class
如果给定的方法没有修改任何成员,那么您总是倾向于const
在最后放置一个关键字。
除了语言方面,提及const
性也是对未来程序员/审阅者的一个很好的指示,即表达式在该区域内具有 const-ness。它与良好的编码实践有关,也增加了可读性。例如(来自@Luc)
constexpr int& f(int& i) { return get(i); }
现在 putconstexpr
表明它get()
也必须是一个constexpr
.
我没有看到任何问题或暗示constexpr
。
编辑:还有一个额外的好处是您可以在某些情况下constexpr
将它们用作参数。template
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.