为什么不允许 constexpr 局部变量作为默认函数参数?

2024-04-23

我想我明白为什么 C++ 不允许local变量作为默认函数参数:

int main () {
   auto local{1024};
   auto lambda = [](auto arg1 = local){};    // "illegal use of local variable as default parameter"
}

但即使该变量是一个也是不允许的局部常量表达式:

int main () {
   constexpr auto local{1024};
   auto lambda = [](auto arg1 = local){};    // "illegal use of local variable as default parameter"
}

然而,一个global允许变量(即使是非 constexpr):

int global;
int main () {
   auto lambda = [](int arg1 = global){};    // OK
}

有人可以解释在这种情况下不允许使用 constexpr 局部变量的理由吗?当默认值在编译时固定并已知时,编译器似乎应该能够为函数构造适当的“默认参数”重载。


这是一个关乎生命周期的问题。让我们将您的函数修改为

auto get_functor() {
   constexpr auto local{1024};
   return [](auto arg1 = local){};    // "illegal use of local variable as default parameter"
}

现在,在调用站点get_functor,您将得到一个 lambda,其默认值是不再存在的对象的值。由于每次调用函数时都会评估默认参数,而相应参数没有参数,因此您需要初始化表达式在所有范围内都有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不允许 constexpr 局部变量作为默认函数参数? 的相关文章

随机推荐

  • “私有构造函数捕获”习语的 Java 示例是什么?

    有人可以向我解释一下吗私有构造函数捕获习惯用法举例说明哪些地方我们实际上需要 不需要这种设计 目的是在施工过程中获取临时价值 解决方案 53 中给出了一个示例Java 谜题 http www amazon co uk JavaTM Puzz
  • 从 Selenium IDE 将测试导出为 python

    我在 Selenium IDE 中进行了几次测试 并将其保存为 HTML 格式的测试套件 该测试套件可以很好地导入回 selenium IDE 但是现在我想使用 python 扩展这些测试 当我单击导出测试套件并选择 python 时 我收
  • 使对象不可调用

    在 JavaScript 中 函数是可调用的 我可以从函数中删除此属性 只留下普通对象吗 var foo function foo callable false pseudocode foo foo is not a function 我可
  • Spring Integration 将路径变量和帖子主体结合到有效负载表达式中

    使用 http 入站网关 我可以使用 SPEL 指定有效负载表达式 该表达式将访问 header requestParams 和 pathVariables 如何同时包含 POST 中的正文 我目前拥有的一个例子是
  • 将 tar.gz 转换为 zip

    我的 Ubuntu 网络服务器上有大量 gzip 压缩档案 我需要将它们转换为 zip 我认为这可以通过脚本来完成 但是我应该使用什么语言 以及如何解压缩和重新压缩文件 我会用一个bash 1 单行 for f in tar gz do r
  • 任务编辑文档预览组件Alfresco

    第一个问题 我想以工作流程任务编辑的形式实现文档预览 我该怎么做 我尝试去适应document details xml and document details ftl to workflow details xml and workflo
  • R 中按值传递

    当尝试调用 grid arrange 将多个图放在同一个 ggplot2 图上时 我首先构建一个我想要的图的列表 然后我构建相应的参数列表来调用 grid arrange 如所解释的在上一个问题中 https stackoverflow c
  • 使用登录名签出 svn+ssh

    我想从存储库中签出一些内容 但是我输入 svn co svn ssh URL 我被要求输入密码 我想他使用的用户名来自我的控制台 但两者不一样 那么我如何使用不同的登录名使用 svn ssh 签出某些内容呢 SSH 允许您在连接 URL 中
  • 通过python从netCDF中提取特定位置的数据

    我是 Python 的新手 也是 NetCDF 的新手 如果我不清楚 请道歉 我有一个包含多个变量的 nc 文件 我需要以新的顺序从这些 nc 文件中提取数据 我的 nc 文件有 8 个变量 经度 纬度 时间 u10 v10 swh mwd
  • 如何“安装”Action Bar Sherlock?

    我正在尝试使用 Action Bar Sherlock 构建示例项目 Action Bar Styled 我在这里下载包含 ABS 的 zip 文件http actionbarsherlock com http actionbarsherl
  • ReactJS onclick 添加或删除类到另一个元素

    我正在努力将我的普通 jQuery 代码转换为 React JS 我是 React 新手 我有以下代码 add click function nav addClass show remove click function nav remov
  • 如何将单个部分中的 Sphinx 章节分成不同的文件?

    我正在使用出色的 Sphinx 工具来创建一些文档 并且我试图通过将同一部分的章节分成单独的文件来保持代码库的模块化形式 请参阅此处了解 章节 和 部分 的定义 http www sphinx doc org en stable rest
  • Homestead 给出 404 Not Found

    我正在尝试启动并运行 Homestead 2 0 以用于 Laravel 的本地开发 我跟着Laracast https laracasts com lessons say hello to laravel homestead two 但我
  • 画布已被跨源数据本地图像污染

    这个问题已经被问了很多次 但我只是不明白为什么这种情况会发生在我身上 基本上 我有一个画布和一个图像 当我尝试这样做时 var canvas document getElementById somecanvas var ctx canvas
  • 使用 NodeJS 和 Restify 重定向客户端

    我正在使用 NodeJS Restify 和 PassportJS 为 SPA 构建 REST 后端以进行身份 验证 除了最后一步之外 一切正常 即将客户端从后端 login facebook callback 重定向到应用程序的主页 我在
  • Ninject + ASP.NET MVC + InRequestScope

    我的 Ninject 有问题 我的绑定规则 this Bind
  • 从搜索中排除文件夹,但不从项目列表中排除

    我有几个不同的项目具有相同的core 我需要的只是将所有非当前项目标记为excluded以避免搜索它们 简单搜索 shift cmd n 等 换句话说 我想获得以下搜索结果core current project 有什么办法吗close一些
  • Angular:如何以法语格式显示日期

    我是 Angular 初学者 我阅读了 Angular 的文档 对于这样一个基本的事情来说很难 我希望我的应用程序中的日期和其他内容具有法语区域设置 而不是默认的 en US 我开始阅读这篇 Angular文档 https angular
  • 在 showModalBottomSheet 外部单击时,如何控制传递给 Navigator.pop() 的内容?

    我启动一个模态底部工作表 然后使用返回的数据作为其未来 var modalFuture showModalBottomSheet modalFuture then data Use data 我通过以下方式从模态小部件返回数据 Naviga
  • 为什么不允许 constexpr 局部变量作为默认函数参数?

    我想我明白为什么 C 不允许local变量作为默认函数参数 int main auto local 1024 auto lambda auto arg1 local illegal use of local variable as defa