我一直在constexpr
研究 C++ 的新特性,但我并不完全理解它的必要性。
例如,下面的代码:
constexpr int MaxSize()
{
...
return ...;
}
void foo()
{
int vec[MaxSize()];
}
可以替换为:
int MaxSize()
{
...
return ...;
}
static const int s_maxSize = MaxSize();
foo()
{
int vec[s_maxSize];
}
更新
第二个示例实际上不是标准的 ISO C++(感谢一些用户指出这一点),但某些编译器(例如 gcc)支持它。因此,这并不是const
使程序有效,而是 gcc 支持这种非标准功能的事实。(据我所知,这只有在数组被定义为函数或方法的本地时才有可能,因为在编译时仍然必须知道全局数组的大小。)如果我在没有选项-std=c++98 -pedantic-errors
的情况下编译,甚至代码
int MaxSize()
{
return 10;
}
void foo()
{
int vec[MaxSize()];
}
将使用 gcc 编译。
因此,我将尝试重新表述我的问题,同时考虑到到目前为止的反馈(以及我在此期间所做的一些进一步阅读)。
我const
大量使用关键字。我可以定义一个在const
其整个生命周期内具有特定值的常量。可以使用任何表达式初始化常量,该表达式只计算一次,即在创建常量时。对于这些情况,我认为这constexpr
毫无用处:它会引入一个非常小的优化,因为定义常量值的表达式将在编译时而不是运行时计算。每次我需要一个带有复杂初始化的运行时常量时,我都会使用关键字const
.
所以constexpr
在我们需要在编译时初始化一个常量的情况下可能会派上用场。一个例子是向量定义:标准不支持在运行时定义大小。另一个示例是具有一个或多个非类型参数的模板。
在这种情况下,我通常使用宏:
#define MAX_SIZE (10)
void foo()
{
int vec[MAX_SIZE];
}
但是,如果我理解正确,constexpr
函数比宏更强大,因为它们允许constexpr
在其定义中递归调用函数。但是,我想不出任何实际应用程序中我曾经想使用如此复杂的计算来定义编译时常量。
因此,即使它可能是一个有趣的功能,我仍然想知道它是否需要(即它多久可以解决宏不够用的情况)。也许看看一些无法用宏解决的现实例子会帮助我改变这种看法。