首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++常量表达式-值可以在编译时计算吗?

C++常量表达式-值可以在编译时计算吗?
EN

Stack Overflow用户
提问于 2018-09-11 02:50:06
回答 4查看 3.1K关注 0票数 7

constexpr说明符

声明可以在编译时计算函数或变量的值。

当我第一次读到这句话时,我觉得很有道理。然而,最近我遇到了一些完全让我着迷的代码。

代码语言:javascript
复制
#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会成功,不会出现错误。)

“可以在编译时计算函数的值”的正确解释是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-09-11 03:30:00

从某种意义上说,引用的措辞有点误导。如果您只是孤立地处理PlusOne,并观察它的逻辑,并假设输入在编译时是已知的,那么其中的计算也可以在编译时执行。给它加上constexpr关键字可以确保我们保持这个可爱的状态,一切都很好。

但是如果输入在编译时是未知的,那么它仍然只是一个普通函数,并将在运行时被调用。

诚然,这一切都是一个巨大的、令人困惑的、模糊的混乱(C++!耶!)。请记住,您的代码描述了程序的含义!它不是在编译的不同阶段的机器指令的直接配方。

(要真正实现这一点,您需要将整数作为模板参数。)

票数 11
EN

Stack Overflow用户

发布于 2018-09-11 02:54:27

如果满足对常量表达式求值的其他要求,则可以在常量表达式内调用constexpr函数。如问题中的代码所示,调用constexpr函数的结果不会自动成为常量表达式。

票数 12
EN

Stack Overflow用户

发布于 2018-09-11 02:54:39

什么才是“在编译时评估函数值的可能”的正确解释?

如果函数的所有参数在编译时都是可计算的,则函数的返回值可以在编译时计算。

但是,如果仅在运行时知道函数参数的值,则只能在运行时计算函数的返回值。

因此,可以在编译时计算函数的值,但这不是必需的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52263790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档