gpt4 book ai didi

c++ - constexpr 上下文中 constexpr 函数内的所有函数是否都必须是 constexpr 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:43 24 4
gpt4 key购买 nike

在 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 函数,尽管在此测试中它没有被调用。

最佳答案

does all the functions inside a constexpr function in constexpr context must be constexpr function?

视情况而定。

constexpr 函数中允许调用非 constexpr 函数的事实并不意味着对 constexpr 函数的所有可能调用都必须产生 常量表达式,但对于需要常量表达式的上下文(如在数组边界中),对constexpr 函数的调用必须求值为常量表达式

本案例标准的相关部分是:

[dcl.constexpr]/5

For a constexpr function or constexpr constructor that is neither defaulted nor a template, if no argument values exist such that an invocation of the function or constructor could be an evaluated subexpression of a core constant expression (8.20), or, for a constructor, a constant initializer for some object (6.6.2), the program is ill-formed, no diagnostic required.

[expr.const]/2

An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (4.6), would evaluate one of the following expressions:

  • (2.2) an invocation of a function other than a constexpr constructor for a literal class, a constexpr function, or an implicit invocation of a trivial destructor [...]

这意味着一个 constexpr 函数可以在它的主体上调用非 constexpr 函数,只要存在一些参数,它的计算结果是一个 常量表达式 或它的子表达式,这就是为什么您可以使用 foo(1) 作为数组绑定(bind)值的原因,因为它的计算不涉及对 bar() 的调用,它是foo(-1) 不是这种情况。

关于c++ - constexpr 上下文中 constexpr 函数内的所有函数是否都必须是 constexpr 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52960040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com