constexpr上下文中constexpr函数内部的所有函数都必须是constexpr函数吗?

卡米诺

在ubuntu gcc 8.0中:

void bar(){}

constexpr int foo(int a)
{
    if (a <=0 )
        bar();

    return 1;
}

int main()
{
    int a1[foo(-1)]; //will give a compile error, which is expected, 
                     //since non-constexpr function is not allowd in constexpr context
}

但是在以下测试中:

int main()
{
    int a2[foo(1)];  //no compile error
}

在这里,bar是非constexpr函数。我想知道为什么constexpr上下文中允许使用非constexpr函数,尽管在此测试中未调用它。

扬斯

constexpr上下文中constexpr函数内部的所有函数都必须是constexpr函数吗?

这取决于。

在函数中允许对非constexpr函数进行调用的事实constexpr并不意味着对constexpr函数的所有可能的调用都必须产生一个常量表达式,但是对于需要一个常量表达式的上下文(例如在数组范围内),该调用到constexpr函数的值必须为常量表达式

该案例的标准相关部分包括:

[dcl.constexpr]/5

对于既没有默认值也没有模板的constexpr函数或constexpr构造函数,如果不存在任何参数值,使得对该函数或构造函数的调用可以是核心常量表达式(8.20)的评估子表达式,或者对于构造函数,则为某个对象(6.6.2)的常量初始化程序,程序格式错误,无需诊断。

[expr.const]/2

表达式e是核心常量表达式,除非按照抽象机(4.6)的规则对e求值将对以下表达式之一求值:

  • (2.2)对文字类的constexpr构造函数以外的函数调用,constexpr函数或对平凡析构函数的隐式调用[...]

这意味着constexpr只要存在一些参数,该函数就可以对非constexpr函数进行调用,因此它可以用作常量数组的表达式或子表达式,这就是为什么可以将其foo(1)用作数组绑定的值的原因,因为它的评估不涉及调用,bar()而不是foo(-1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在非constexpr上下文中的constexpr函数中使用lambda:clang vs gcc

来自分类Dev

在常量表达式上下文中定义之前,嵌套的constexpr函数调用

来自分类Dev

Clang抱怨在未评估的上下文中未定义的constexpr函数

来自分类Dev

在常量表达式上下文中定义之前,嵌套的constexpr函数调用

来自分类Dev

非constexpr变量有时可在constexpr上下文中使用吗?

来自分类Dev

在constexpr上下文中验证std :: initializer_list

来自分类Dev

constexpr c字符串连接,在constexpr上下文中使用的参数

来自分类Dev

全局执行上下文中没有内部函数的 JavaScript 变量不可用

来自分类Dev

constexpr函数内部的std :: experimental :: optional

来自分类Dev

声明constexpr函数或方法

来自分类Dev

Constexpr数学函数

来自分类Dev

is_defined constexpr函数

来自分类Dev

抛出constexpr函数

来自分类Dev

Constexpr数学函数

来自分类Dev

寻求澄清constexpr函数

来自分类Dev

Constexpr成员函数

来自分类Dev

条件constexpr函数

来自分类Dev

constexpr函数的noexcept行为

来自分类Dev

递归constexpr函数

来自分类Dev

'constexpr'函数奇怪的行为?

来自分类Dev

使用constexpr和函数

来自分类Dev

constexpr 函数及其参数

来自分类Dev

为什么constexpr不是所有函数的默认值?

来自分类Dev

虚函数可以是constexpr吗?

来自分类Dev

我对constexpr函数感到困惑吗?

来自分类Dev

constexpr函数中的非constexpr调用

来自分类Dev

有什么方法可以在constexpr / consteval上下文中以char数组的形式访问已知大小的任意数据?

来自分类Dev

在广义函数上下文中具有抽象参数的特殊函数

来自分类Dev

如何有效调试constexpr函数?

Related 相关文章

热门标签

归档