文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.5 constexpr 函数中的局部变量
到 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()
函数可以在编译时进行求值。本地的变量(此处为 low
和 x
)仅在编译器中存在。计算不能对调用者的环境产生副作用。Gabriel Dos Reis 和 Bjarne Stroustrup 在原始的(学术)constexpr
论文中指出了这种可能性 [Dos Reis and Stroustrup 2010]。
这种放松简化了许多 constexpr
函数并使许多 C++ 程序员感到高兴。以前在编译时只能对算法的纯函数表达式进行求值,他们对此感到不满。特别是,他们希望使用循环来避免递归。就更长期来看,这释放出了要在 C++17 和 C++20(§9.3.3)中进一步放松限制的需求。为了说明潜在的编译期求值的能力,我已经指出 constexpr thread
也是可能的,尽管我并不急于对此进行提案。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论