最令人烦恼的解析[重复]

2023-11-24

我在这里看到了一个代码Cpp Quiz[问题#38]

#include <iostream>

struct Foo
{
  Foo(int d) : x(d) {}
  int x;
};

int main() 
{ 
  double x = 3.14;

  Foo f( int(x) );

  std::cout << f.x << std::endl;

  return 0;
} 

据说这段代码格式不正确,因为Foo f( int(x) );将被视为函数声明而不是类型的对象声明Foo.

据我所知,这是“最令人烦恼的解析”的一个例子。我的问题是这个语法是什么int(x)在声明中Foo f( int(x) );意思是?到目前为止,我只看到了如下函数声明:

  1. Foo f( int ); and

  2. Foo f( int x );

是不是一样Foo f( int x );?


这个语法是什么int(x)在声明中Foo f( int(x) ); mean?

周围的括号x都是多余的并且会被忽略。所以int(x)是相同的int x这里,这意味着一个名为x与类型int.

是不是一样Foo f( int x );?

Yes. Foo f( int(x) );,是一个名为的函数声明f,返回Foo,采用一个名为x与类型int.

这是标准的解释。[dcl.ambig.res]/1:

(强调我的)

由于函数风格之间的相似性而产生的歧义 [stmt.abig] 中提到的强制转换和声明也可以出现在 声明的上下文。在这种情况下,选择是 函数声明带有一组多余的括号 参数名称和带有函数风格转换的对象声明 初始化程序。正如文中提到的含糊之处 [stmt.ambig],该决议是考虑任何可能的结构 可能是一个声明.

注意:声明可以是 通过在参数周围添加括号来明确消除歧义。 可以通过使用复制初始化或 列表初始化语法,或使用非函数样式的强制转换。

struct S {
  S(int);
};

void foo(double a) {
  S w(int(a));      // function declaration
  S x(int());       // function declaration
  S y((int(a)));    // object declaration
  S y((int)a);      // object declaration
  S z = int(a);     // object declaration
}

So, int(x)将被视为(参数的)声明而不是函数样式转换。

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

最令人烦恼的解析[重复] 的相关文章

随机推荐

  • SQLite 连接对象泄露 - Android

    我正在制作我的第一个 Android 应用程序 我首先学习了一些 sqlite 教程 它教我使用扩展 SQLiteOpenHelper 的 databaseHelper 所以我的databaseHelper确实扩展了SQLiteOpenHe
  • 如何提高 Access 中 ODBC 链接表的批量插入性能?

    我有 CSV 和 TXT 文件要导入 我将文件导入到 Access 中 然后将记录插入到链接的 Oracle 表中 每个文件大约有 300 万行 并且该过程需要很长时间才能完成 导入到 Access 中的速度非常快 但插入到链接的 Orac
  • 如何在 Hibernate 验证器中添加自定义错误消息

    我有一个像这样的简单课程 import javax validation constraints NotNull import org hibernate validator constraints Length public class
  • 简单的 html 与 vue.js 不起作用

    我和 vue js 的初学者点击了这个链接 https www sitepoint com getting started with vue js 几乎将代码复制到我的 html 中 但是它不起作用 有人可以帮我找出问题所在吗 这是所有代码
  • Nhibernate + QueryOver:使用Where 过滤敏感信息

    我正在尝试使用 QueryOver 在 nHibernate 中构建一个简单的查询 但我希望它将所有内容转换为小写或忽略敏感内容 Domain User User Session QueryOver
  • 为日期添加 10 秒

    如何向 JavaScript 日期对象添加 10 秒 像这样的东西 var timeObject new Date var seconds timeObject getSeconds 10 timeObject timeObject sec
  • Node.js Https请求错误

    我试过了文档中的示例而且效果很好 但是当我将网址更改为https api mercadolibre com sites 请求挂起 我唯一得到的是 Error socket hang up code ECONNRESET 这是我的代码 var
  • 使用 github 时“找不到 Visual Studio Web 请求处理程序”的解决方法?

    当我在 github 上选择 在 Visual Studio 中打开 时 出现以下错误 找不到 Visual Studio Web 请求处理程序 我相信这是由于 git client 协议处理程序未正确注册造成的 这里列出了 VS2015
  • String对象真的是通过引用吗? [复制]

    这个问题在这里已经有答案了 我一直在学习 新手 NET 但我有一些疑问 从书中的例子中我了解到 字符串是对象 然后是引用类型 所以 我做了这个测试 结果与我预期的不同 我真的很好奇 这是一个例外吗 因为 字符串 是特殊类型 class Pr
  • 如何在 java 中将堆栈跟踪添加到调试打印输出中

    从调试打印输出中打印堆栈跟踪的最简单方法是什么 在测试过程中 您通常想知道导致引发调试消息的情况的调用堆栈 如果您使用的是 log4j Exception e new Exception log error error here e 会将堆
  • JQuery 与其他 JQuery 库冲突

    我使用 jquery 作为模块 我的 joomla 模板有一个集成的 jquery 菜单 所以他们互相冲突 有没有办法解决这个问题 遵循模块的脚本代码
  • 从输入流获取文件名 (Java)

    如果我有这段代码 我如何保留原始文件的文件名或将其重新分配给新文件 InputStream input assetInfo openStream File t new File OutputStream out new FileOutput
  • 将 javascript 对象序列化为 json 并返回

    我正在使用 jQuery post 方法将一些数据发送到服务器 我不想自己构建 JSON 字符串 而是想简单地使用 JavaScript 对象 当我得到返回字符串 JSON 格式 时 我想自动构造一个相应的 JavaScript 对象 这可
  • 使用 Fluent NHibernate 将 List 映射到分隔字符串

    我的模型看起来像这样 public class Product public string Name get set public string Description get set public double Price get set
  • 如何在 Macos 中检测新文件或修改过的文件

    在Windows操作系统中 MS提供了ReadDirectoryChangesW和FindFirstChangeNotification API来检测新的或修改的文件 Mac OSX是否也提供相同的功能 在 Mac OS X Leopard
  • React - 如何将参数传递给事件处理程序

    好吧 我是 React 新手 关于事件处理程序的一件事真的非常困扰我 我似乎无法得到关于如何向它们传递参数的直接答案 到目前为止 我看到的有两种方法 Bind props squareClick bind this argument Inl
  • 如何使用 CSS 制作 V 形箭头?

    好的 所以每个人都知道你可以用这个来制作一个三角形 triangle width 0 height 0 border left 50px solid transparent border right 50px solid transpare
  • 在 PDO 查询上设置 group_concat_max_len

    我有以下查询 cases conn gt prepare SELECT GROUP CONCAT text SEPARATOR as texts year FROM cases GROUP BY year ORDER BY ano DESC
  • CardLayout 获取所选卡片的名称

    如何获取卡片布局中所选面板的字符串标识符 CardLayout 不知道当前选择的面板是什么 调用 show 方法时 您应该自己将其保留在内存中
  • 最令人烦恼的解析[重复]

    这个问题在这里已经有答案了 我在这里看到了一个代码Cpp Quiz 问题 38 include