c++ - requires 表达式是否允许“捕获”封闭范围的变量?
问题描述
在以下示例中,函数参数用于使用 requires 表达式测试使用它们的表达式是否格式正确。requires 表达式不带参数;它直接使用函数范围内的变量:
#include <cstddef>
#include <vector>
template<typename T>
void Resize(T &v, std::size_t const n)
{
if constexpr (requires { v.resize(n); })
v.resize(n);
}
template<typename T>
void Eziser(T &v, std::size_t const n)
{
if constexpr (requires { v.eziser(n); })
v.eziser(n);
}
int main()
{
std::vector<int> v;
Resize(v, 10u);
Eziser(v, 10u);
}
上面的代码使用 Clang 概念分支编译。但是,GCC10 只接受对Resize
. GCC9 ICE。Clang 是否正确地接受了它?
解决方案
是的,需求表达式可以使用范围内的任何内容。毕竟,它只需要它命名的任何东西的类型,除了嵌套需求或其他常量表达式。周围的声明和它自己的(正式)参数一样都是如此。
C++20 在 [expr.prim.req]/5 中明确提到了这一点:
需求主体包含一系列需求。这些 要求可以引用本地参数、模板参数和任何其他从封闭上下文可见的声明。
然而,这只是对一般规则的重述,因此已被删除。
推荐阅读
- restheart - 无需身份验证即可休息
- soapui - 如何解决“获取响应时出错:java.net.SocketException:连接重置”
- javascript - 尝试制作 CSS3 对角线幻灯片动画,但没有按预期工作
- scala - 如何在Scala中找到数组中值的平均值 - Apache Spark
- python - 在python中下载文件时如何解决SSL错误?
- angular - npm 错误!路径 C:\Users\ruwan\Documents\projects\new project\Hair-4-U-hospital\Admin\Hair-4-U-Manufacture\node_modules\@firebase\util\dist
- angular - 如何配置表单字段需要验证或不使用属性文件
- sql - 慢慢更新维度
- reactjs - 使用 Gatsby 从富文本组件中将 Markdown 转换为 HTML
- python - 如何在没有此错误的情况下获得正确的文件目录?