【发布时间】:2011-06-12 11:53:51
【问题描述】:
在我看来,拥有一个“总是返回 5 的函数”会破坏或淡化“调用函数”的含义。必须有一个原因,或者需要这种能力,否则它不会出现在 C++11 中。为什么会在那里?
// preprocessor.
#define MEANING_OF_LIFE 42
// constants:
const int MeaningOfLife = 42;
// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
在我看来,如果我编写了一个返回文字值的函数,并且我进行了代码审查,那么有人会告诉我,我应该声明一个常量值而不是写 return 5。
【问题讨论】:
-
你能定义一个返回
constexpr的递归函数吗?如果是这样,我可以看到一个用法。 -
我相信这个问题应该说明“如果编译器可以自己推断出一个函数是否可以在编译时评估,为什么要引入一个新的关键字(!)”。让它“由关键字保证”听起来不错,但我想我希望尽可能保证它,而不需要关键字。
-
@Kos :更熟悉 C++ 内部的人可能更喜欢你的问题,但我的问题来自一个以前编写过 C 代码但不熟悉 C++ 2011 关键字的人的角度完全没有,也没有 C++ 编译器的实现细节。能够推理编译器优化和常量表达式推导是一个比这个更高级的用户问题的主题。
-
@Kos 我的想法和你一样,我想出的答案是,如果没有 constexpr,你怎么会(很容易)知道编译器实际上编译时为您评估了该功能?我想您可以检查程序集输出以查看它做了什么,但更容易告诉编译器您需要该优化,如果由于某种原因它不能为您做到这一点,它会给您一个很好的编译 -错误而不是默默地未能优化您期望它优化的地方。
-
@Kos:你可以对
const说同样的话。事实上,强制意图是有用的!数组维度是典型的例子。