返回介绍

5.5 constexpr 函数中的局部变量

发布于 2024-08-19 12:44:37 字数 3112 浏览 0 评论 0 收藏 0

到 2012 年,人们不再害怕 constexpr 函数,并开始要求放松对其实现的限制。实际上有些人希望能够在 constexpr 函数中执行任何操作。但是,无论是使用者还是编译器实现者都还没有为此做好准备。

经过讨论,Richard Smith(谷歌)提出了一套相对适度的放松措施 [Smith 2013]。特别是,允许使用局部变量和 for 循环。例如:

constexpr int min(std::initializer_list<int> xs)
{
  int low = std::numeric_limits<int>::max();
  for (int x : xs)
    if (x < low)
      low = x;
  return low;
}

constexpr int m = min({1,3,2,4});

给定一个常量表达式作为参数,这个 min() 函数可以在编译时进行求值。本地的变量(此处为 lowx)仅在编译器中存在。计算不能对调用者的环境产生副作用。Gabriel Dos Reis 和 Bjarne Stroustrup 在原始的(学术)constexpr 论文中指出了这种可能性 [Dos Reis and Stroustrup 2010]。

这种放松简化了许多 constexpr 函数并使许多 C++ 程序员感到高兴。以前在编译时只能对算法的纯函数表达式进行求值,他们对此感到不满。特别是,他们希望使用循环来避免递归。就更长期来看,这释放出了要在 C++17 和 C++20(§9.3.3)中进一步放松限制的需求。为了说明潜在的编译期求值的能力,我已经指出 constexpr thread 也是可能的,尽管我并不急于对此进行提案。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文