在我看来,拥有一个“总是返回5的函数”破坏或稀释了“调用函数”的意义。必须有一个原因,或者需要这个功能,否则它就不会出现在c++ 11中。为什么会在那里?

// preprocessor.
#define MEANING_OF_LIFE 42

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }

在我看来,如果我写一个函数,返回一个字面值,然后我进行代码检查,有人会告诉我,我应该声明一个常量值,而不是返回5。


当前回答

据我所知,对constexpr的需求来自元编程中的一个问题。Trait类可能有常量表示为函数,例如:numeric_limits::max()。使用constexpr,这些类型的函数可以在元编程中使用,或者作为数组边界,等等。

我想到的另一个例子是,对于类接口,您可能希望派生类型为某些操作定义自己的常量。

编辑:

在对SO进行了一番研究之后,似乎其他人已经提出了一些使用constexpr可能实现的功能的示例。

其他回答

何时使用constexpr:

只要有编译时间常数。

它在某些方面很有用

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }

int some_arr[MeaningOfLife()];

将它与特质类或类似的类联系起来,它会变得非常有用。

你的基本例子和常数本身的例子是一样的。为什么要使用

static const int x = 5;
int arr[x];

over

int arr[5];

因为这样更容易维护。使用constexpr写和读要比现有的元编程技术快得多。

另一个用途(尚未提及)是constexpr构造函数。这允许创建编译时常量,这些常量不必在运行时进行初始化。

const std::complex<double> meaning_of_imagination(0, 42); 

将其与用户定义的字面量配对,就可以完全支持字面的用户定义类。

3.14D + 42_i;

据我所知,对constexpr的需求来自元编程中的一个问题。Trait类可能有常量表示为函数,例如:numeric_limits::max()。使用constexpr,这些类型的函数可以在元编程中使用,或者作为数组边界,等等。

我想到的另一个例子是,对于类接口,您可能希望派生类型为某些操作定义自己的常量。

编辑:

在对SO进行了一番研究之后,似乎其他人已经提出了一些使用constexpr可能实现的功能的示例。