gpt4 book ai didi

c++ - 为什么 constexpr 适用于不纯函数

转载 作者:行者123 更新时间:2023-12-03 01:38:19 25 4
gpt4 key购买 nike

在浏览我关于 constexpr 的旧问题之一时,我偶然发现了一条非常(恕我直言)重要的评论。基本上可以归结为:(这是合法的 C++11 :( )

 constexpr double f(bool b)
{
return b? 42:42/(rand()+1); // how pure is rand ;)
}

我的问题是标准允许这样做的原因是什么。因为我是引用透明度的忠实粉丝,所以我希望他们有充分的理由:)并且我想知道这一点。

顺便说一句,有相关的 Q,但大多数 A 甚至没有提到纯粹的东西,或者当他们这样做时,他们没有具体说明为什么 std 允许这样做。 Relation between constexpr and pure functions

最佳答案

在标准中,相关要求隐藏在 constexpr 函数的主要要求列表下方。它位于 §7.1.5/5 中:

For a constexpr function, if no function argument values exist such that the function invocation substitution would produce a constant expression (5.19), the program is ill-formed; no diagnostic required.

§5.19 定义了常量表达式的要求,因此您不能调用 rand()

放宽的限制允许您拥有条件纯函数。您的示例 f(true) 是有效的模板参数,但 f(false) 不是。

当然,缺点是编译器不会验证 constexpr 函数是否确实可以用于其预期目的。您需要编写测试用例。

啊,litb的回答也是正确的。 (但是这个措辞更简单。)

关于c++ - 为什么 constexpr 适用于不纯函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13295089/

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