constexpr
说明符
声明可以在编译时计算函数或变量的值。
当我第一次读到这句话时,我觉得很有道理。然而,最近我遇到了一些完全让我着迷的代码。
#include <iostream>
void MysteryFunction(int *p);
constexpr int PlusOne(int input) {
return input + 1;
}
int main() {
int i = 0;
MysteryFunction(&i);
std::cout << PlusOne(i) << std::endl;
return 0;
}
看着这段代码,我无法说出PlusOne(i)
的结果应该是什么,不管它实际上是如何编译的!(链接当然会失败,但g++ -std=c++11 -c
会成功,不会出现错误。)
“可以在编译时计算函数的值”的正确解释是什么?
发布于 2018-09-11 03:30:00
从某种意义上说,引用的措辞有点误导。如果您只是孤立地处理PlusOne
,并观察它的逻辑,并假设输入在编译时是已知的,那么其中的计算也可以在编译时执行。给它加上constexpr
关键字可以确保我们保持这个可爱的状态,一切都很好。
但是如果输入在编译时是未知的,那么它仍然只是一个普通函数,并将在运行时被调用。
诚然,这一切都是一个巨大的、令人困惑的、模糊的混乱(C++!耶!)。请记住,您的代码描述了程序的含义!它不是在编译的不同阶段的机器指令的直接配方。
(要真正实现这一点,您需要将整数作为模板参数。)
发布于 2018-09-11 02:54:27
如果满足对常量表达式求值的其他要求,则可以在常量表达式内调用constexpr
函数。如问题中的代码所示,调用constexpr
函数的结果不会自动成为常量表达式。
发布于 2018-09-11 02:54:39
什么才是“在编译时评估函数值的可能”的正确解释?
如果函数的所有参数在编译时都是可计算的,则函数的返回值可以在编译时计算。
但是,如果仅在运行时知道函数参数的值,则只能在运行时计算函数的返回值。
因此,可以在编译时计算函数的值,但这不是必需的。
https://stackoverflow.com/questions/52263790
复制相似问题