gpt4 book ai didi

c++ - 为什么**不**将函数声明为 `constexpr` ?

转载 作者:IT老高 更新时间:2023-10-28 13:22:50 27 4
gpt4 key购买 nike

任何只包含 return 语句的函数都可以被声明constexpr 因此将允许在编译时进行评估,如果所有参数是 constexpr 并且只有 constexpr 函数在其主体中被调用。 有什么理由不声明任何这样的函数constexpr

例子:

  constexpr int sum(int x, int y) { return x + y; }
constexpr i = 10;
static_assert(sum(i, 13) == 23, "sum correct");

谁能提供一个声明函数的例子 constexpr会造成什么伤害吗?


一些初步的想法:

即使没有充分的理由去声明一个函数不是 constexpr 我可以想象 constexpr 关键字有一个过渡角色:它在不需要编译时的代码中不存在评估将允许不实现编译时的编译器评估仍然编译该代码(但在代码上可靠地失败这需要它们通过使用 constexpr 来明确说明)。

但我不明白的是:如果没有充分的理由曾经声明一个函数不是 constexpr,为什么不是 every 函数在标准库中声明 constexpr? (你不能争论还没有完成,因为还没有足够的时间这样做,因为为 all 这样做是不费吹灰之力的——这与为每个单独的函数决定是否使其成为 constexpr 相反。)--- 我知道 N2976故意不需要 cstrs 用于许多标准库类型,例如作为容器,因为这对可能的限制太大了实现。让我们将它们排除在论点之外,只是想知道:一旦标准库中的一个类型实际上有一个constexpr cstr,为什么不是每个对其操作的函数都声明为constexpr

在大多数情况下,您也不能争辩说您可能不喜欢声明函数 constexpr 仅仅是因为您没有设想任何编译时使用:因为如果其他人 evtl.将使用您的代码,他们可能会看到您没有看到的这种用法。 (当然,对于类型特征类型和类似的东西是允许的。)

所以我想故意不声明函数constexpr一定有很好的理由和很好的例子?

(对于“每个功能”,我总是指:满足constexpr 的要求,即定义为单个return 语句,只接受带有 constexpr 类型的参数cstrs 并且只调用 constexpr 函数。从 C++14 开始,much more is allowed in the body of such function :例如,C++14 constexpr 函数可以使用局部变量和循环,因此可以声明更广泛的函数类constexpr。)

问题Why does std::forward discard constexpr-ness?是这个的一个特例。

最佳答案

函数只有在遵守 constexpr 的规则时才能被声明为 constexpr --- 没有动态转换,没有内存分配,没有调用非 constexpr 函数等

将标准库中的函数声明为 constexpr 要求所有实现都遵守这些规则。

首先,这需要检查每个函数是否可以实现为constexpr,这是一项漫长的工作。

其次,这是对实现的一个很大限制,并且会禁止许多调试实现。因此,只有当 yield 超过成本,或者要求足够严格以至于实现几乎必须遵守 constexpr 规则时,它才是值得的。对每个功能进行这种评估又是一项漫长的工作。

关于c++ - 为什么**不**将函数声明为 `constexpr` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5112305/

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