consteval函数允许哪些内容?与constexpr函数的使用限制有何差异
首先明确结论:你列出的7条constexpr函数内部实现的禁止项,对consteval函数完全适用,两者的函数体语法限制没有任何差异——不存在consteval允许但constexpr不允许的内部代码写法,反过来也没有。
两者的区别全部体现在调用规则和函数属性限制层面,主要差异如下:
constexpr函数是双模式的:当入参都是编译期常量、返回值被用在需要常量表达式的场景时,就会在编译期执行;如果不符合上述条件,也可以退化为普通函数在运行期执行。而consteval是强制编译期执行的即时函数,只要调用就必须在编译期完成,所有传入的参数必须是编译期常量,一旦无法完成编译期求值会直接报编译错误,完全没有运行期执行的可能。constexpr函数可以声明为虚函数,consteval函数不可以:虚函数依赖运行期动态派发机制,和consteval必须在编译期确定执行逻辑的要求本质冲突。constexpr函数可以正常取地址、赋值给函数指针后在运行期调用,consteval函数没有对应的运行期实体,尝试取它的地址会直接触发编译报错。
内容的提问来源于stack exchange,提问作者Karen Baghdasaryan
相关产品推荐
相关产品推荐

