C++ 中的函数与变量声明

2024-02-23

这段代码的工作原理:

std::ifstream f(mapFilename.c_str());
std::string s = std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);

Whereby mapFilename is an std::string and void ParseGameState(const std::string&);.

这并不:

std::ifstream f(mapFilename.c_str());
std::string s(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);

这是错误:

game.cpp: In member function ‘int Game::LoadMapFromFile(const std::string&)’:
game.cpp:423: error: no matching function for call to ‘ParseGameState(std::string (&)(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()))’
game.cpp:363: note: candidates are: ParseGameState(const std::string&)

所以看起来它认识s在这种情况下,作为函数声明而不是变量声明。

这是为什么?这是 GCC 4.2.1(Apple 版本)中的错误吗?或者 GCC 是否正确处理这个问题?这是 C++ 标准中未定义的吗?


这是 C++ 的“最令人烦恼的解析”。快速谷歌一下,应该会出现很多带有很多细节的点击。基本答案是肯定的,编译器is将其视为函数声明——C++ 要求它这样做。您的编译器没有任何问题(至少在这方面)。

如果你能感到安慰的话,那就是你遇到了很多好伙伴。事实上,C++0x 添加新的大括号初始化语法是很常见的,很大程度上是因为它避免了这种歧义。使用它,您可以编写如下内容:

std::string s{std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>()};

这将清楚地表明大括号的内容旨在作为初始化值s, not名为函数的参数类型s。我不知道 Apple 是否有它的端口,但 gcc 从 4.5 版(左右)开始接受新语法。

编辑:重读 N3092,约翰内斯(像往常一样)非常正确。适用的语言是(§8.5.4/3/5):“如果 T 有一个初始化器列表构造函数,则参数列表由初始化器列表作为单个参数组成;否则,参数列表由初始化器的元素组成列表。”

所以,自从std::string有一个初始化列表构造函数,这将尝试“填充”这两个istreambuf_iterators 到初始化列表中,并将其传递给std::stringctor 接受一个初始化列表——但这会导致类型不匹配,因此代码无法编译。对于其他一些类型(不同于std::string did not有一个初始化列表构造函数)上面的转换将起作用(感谢上面引用中的“否则...”)。如果是std::string,您必须使用当前的替代方案之一,例如std::string s = std:string(...).

我对不正确的建议修复表示歉意——在这种情况下,情况变得更糟,因为它混淆了一个本身可能会过度混乱的问题,如果有什么需要仔细澄清的话,尤其是在接下来的几年里。

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

C++ 中的函数与变量声明 的相关文章

随机推荐

  • 由于可能的配置错误,请求超出了 10 个内部重定向的限制。?

    我有一个简单的重写 RewriteRule addnew 0 不过我得到了 Request exceeded the limit of 10 internal redirects due to probable configuration
  • c# System.guid 不包含 Parse 的定义

    AT Anchor System Guid Parse DataBinder Eval e Item DataItem Anchor ToString 这会抛出 System Guid does not contain a definiti
  • “clr-namespace”URI 引用未包含在程序集中的命名空间

    我试图在我的 XAML 中包含一些转换值的类 但是 当我编译时 我收到以下错误 未定义的 CLR 命名空间 clr namespace URI 引用未包含在程序集中的命名空间 View Summary Converters View Vie
  • 角度 4 中的动画路线

    我正在尝试以角度 4 为路线过渡设置动画 动画在页面首次加载和页面刷新时起作用 所以我知道动画有效 但在我切换路线时则不然 我缺少什么 这是代码 组件元数据 animations fadeInAnimation 模板 div class r
  • iPhone 开发:初学者资源

    正如标题所说 您有任何可用资源来开始为 iPhone 进行开发吗 书籍 在线资源 工具 开发环境 先决条件以及与iPhone编程相关的一切都会很好 Thanks 假设您是初学者 对于书籍而言 此列表是一个很好的起点 http cocoade
  • 如何选择一定长度的数据项?

    如何选择列中的行以使行大小 例如 身份证号 名字 仅选择名字超过 10 个字符的人 他们的名字太长 如果您必须使用特定的 RDBMS 那么解决方案很简单 Use the LENGTH function 根据您的数据库 长度函数可以是 LEN
  • 在非 boost 线程中使用 boost::thread_specific_ptr

    我正在阅读文档部分boost thread specific ptr http www boost org doc libs 1 55 0 doc html thread thread local storage html 并尝试解析这一段
  • 无法在 Windows 上打印彩色文本

    我是 Python 新手 试图在控制台中打印彩色文本 我的操作系统是windows 10 代码如下 class bcolors Colors for console HEADER 033 95m YGREEN 033 92m WARNING
  • 为什么新的 Pick 类型允许 React 的 setState() 中 K 的子集?

    我以为我明白了新的目的TS 2 1 Pick type https www typescriptlang org docs handbook release notes typescript 2 1 html partial readonl
  • 可变参数列表

    假设我有 2 个函数 void f1 int p1 int v1 AND void f2 int v1 在 f1 内部 我想将所有参数从可变参数列表传递到 f2 void f1 int p1 int v1 f2 pass all varia
  • 升级到 Spring Security 6 后角色层次结构不起作用

    我正在从 spring boot 2 7 x 升级到 3 0 0 按照官方文档中的建议进行更改后 我发现我的角色层次结构没有得到尊重 I added expressionHandler 到我的代码中建议的Spring Security 6
  • 如何在 R Markdown 中从第二页开始页码?

    我想知道是否有一种方法可以从第二页开始页码和 或从第二页开始打印页码R Markdown创建 pdf 输出时 当向文档添加标题页时 这会很有用 Thanks 收到有用的评论后 我通过添加解决了问题 pagenumbering gobble
  • 在 CakePHP 中使用媒体视图下载文件

    我想通过 4 个不同的链接下载 4 个不同的文件 我正在使用媒体视图下载文件 但我必须在控制器的下载功能中对文件名进行硬编码 function download this gt view Media params array id gt e
  • 通过外部站点登录 Moodle

    我正在设置一个 Moodle 环境 我需要用户能够使用其凭据通过外部站点登录that地点 理想情况下 他们会访问该网站 登录 然后单击一个按钮 将他们及其帐户信息发送到 Moodle 一旦他们到达 Moodle Moodle 将检查帐户信息
  • C++ STL 容器 ::clear ::swap

    清理 大型 STL 容器的最快方法是什么 在我的应用程序中 我需要处理大尺寸std map 例如 10000 个元素 我测试了以下3种方法来清除std map 每次需要时创建一个新容器 Calling map clear method Ca
  • 使 optgroup 标签在下拉列表中选择

    我计划为主要车型 瑞典汽车 提供一个简短的描述页面 我还想表明沃尔沃和萨博在下拉列表中位于瑞典汽车下方 然后 当我单击沃尔沃时 它应该导航到沃尔沃描述页面 如何显示最初选择的 optgroup 标签 谢谢
  • Windows:如何使用带路径的主机文件?

    这有效 127 0 0 1 www somesite com 但不是这个 127 0 0 1 somepath www www mysite com 我究竟做错了什么 是否可以绘制这样的完整路径 如果没有 完成我想做的事情的最简单方法是什么
  • 为 Android 部署 Phonegap / Cordova 应用程序?

    我正在 Android 上测试 Phonegap Cordova 3 0 应用程序 从 2 x 版本开始 Cordova 严重依赖命令行终端 我已经完成了所有设置 可以构建应用程序了 但有两件事困扰着我 首先 一个Android项目有两个w
  • 敲除剑道问题通过计算的可观察值进行绑定

    我尝试使用knockout kendo js 在knockout forEach 模板中声明kendo dropdownlist 控件 以便当新项目添加到knockout 可观察数组时 新的kendo dropdownlist 会在UI 中
  • C++ 中的函数与变量声明

    这段代码的工作原理 std ifstream f mapFilename c str std string s std string std istreambuf iterator