什么是C++常量子表达式?附示例解析与相关疑问
C++常量子表达式相关问题解答
对标准定义的解读
C++标准第3.14节对常量子表达式的定义,核心逻辑是:一个子表达式如果本身没有任何违反核心常量表达式规则的操作,那么当它作为某个条件表达式CE的一部分时,就不会阻碍CE成为核心常量表达式——这样的子表达式就是常量子表达式。
你的示例分析
针对你给出的代码片段:
哪些是常量子表达式?
f()和g()属于常量子表达式。因为这两个函数的返回值是通过兼容常量表达式规则的构造方式创建的X对象(构造函数仅做简单成员初始化,无任何运行时专属操作),它们本身的求值过程完全符合核心常量表达式要求,不会拖任何条件表达式的后腿。“不会阻碍CE成为核心常量表达式”是什么意思?
这句话是在明确常量子表达式的边界:如果把某个子表达式放到条件表达式CE里,只要CE的其他部分都满足核心常量表达式的要求,这个子表达式不会让CE“失效”(即不会导致CE不符合核心常量表达式规则),那它就是常量子表达式。
反过来,如果子表达式包含std::cin、修改非const全局变量、调用非constexpr函数这类操作,那它就不是常量子表达式——因为哪怕CE的其他部分都合法,只要带上它,CE就绝对成不了核心常量表达式。(i == 0) ? f() : g()是常量表达式吗?
不是。整个条件表达式的求值依赖于运行时输入的i值,而i是通过std::cin >> i赋值的,属于运行时才能确定的变量。常量表达式要求整个表达式能在编译时确定结果,显然这个条件表达式做不到,因此它不是常量表达式。
内容的提问来源于stack exchange,提问作者cmutex
相关产品推荐
相关产品推荐

