关于用友元函数查找名字的问题

2023-11-26

我已阅读 [basic.lookup.unqual] 的标准部分,对此我感到困惑:

typedef int f;
namespace N {
  struct A {
    friend void f(A &);
    operator int();
    void g(A a) {
      int i = f(a);  // f is the typedef, not the friend function: equivalent to int(a)
    }
  };
}

请考虑上面的代码;我不明白为什么要命名f是类型int, 代替void f(A &)。根据我的理解,名称查找应该找到void f(A &)首先在类范围 A 中。如果在那里找不到名称,它将在外部名称空间中执行查找。显然,有一个名字void f(A &)在班上A正如标准所说:

一旦找到名称声明,名称查找就会结束

那么为什么名称指的是类型int这里,是否有其他特殊规则?


首先,朋友宣言本身并不使f对于名称查找可见,f只能通过 ADL 找到。

首先在类或类模板 X 内的友元声明中声明的名称将成为 X 的最内层封闭命名空间的成员,但对于查找不可见(除了考虑 X 的参数相关查找之外),除非命名空间范围内的匹配声明是假如

从标准来看,[命名空间.memdef]/3,

友元声明本身并不使名称对非限定查找或限定查找可见。 [ 注意:如果在命名空间范围内提供了匹配的声明(在授予友谊的类定义之前或之后),则好友的名称将在其命名空间中可见。 — 尾注] 如果调用友元函数或函数模板,则可以通过名称查找来找到其名称,该名称查找考虑来自与函数参数类型关联的命名空间和类的函数 ([basic.lookup.argdep])。如果友元声明中的名称既不是限定的也不是模板 ID,并且声明是函数或详细类型说明符,则确定实体是否先前已声明的查找不应考虑最内部封闭命名空间之外的任何范围。

问题是要应用ADL,是否f(a)是不是函数调用必须提前确定。

[基本.lookup.unqual]/3,

(强调我的)

用作函数调用的后缀表达式的非限定名称的查找在 [basic.lookup.argdep] 中描述。 [ 笔记:为了确定(在解析期间)表达式是否是函数调用的后缀表达式,应用通常的名称查找规则.

在此阶段,函数名称f是不可见的并且类型名f被发现,那么f(a)被认为不是一个函数,那么 ADL 根本不会被应用。

因为表达式不是函数调用,所以依赖于参数的名称查找 ([basic.lookup.argdep]) 不适用,并且未找到友元函数 f。

顺便说一句:添加声明f在命名空间范围内使函数名称f可见和f(a)将被视为函数调用(然后你会得到错误f回报void不能用于初始化i). e.g.

typedef int f;
namespace N {
  struct A;
  void f(A &);
  struct A {
    friend void f(A &);
    operator int();
    void g(A a) {
      int i = f(a);  // f is the friend function now
    }
  };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于用友元函数查找名字的问题 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • Opencv虚拟相机旋转/平移以获得鸟瞰图

    我有一个校准过的相机 我确切地知道内部和外部数据 相机的高度也是已知的 现在我想虚拟地旋转相机以获得鸟瞰图 这样我就可以用三个旋转角度和平移来构建单应性矩阵 我知道 2 个点可以通过单应性从一张图像转换为另一张图像 x K R t n d
  • .Rprofile 未来源

    我试图在 Rprofile 脚本中为 blogdown 包设置一些全局选项 但它们没有被获取 Rprofile 脚本如下所示 options blogdown ext Rmd blogdown author Maryam Khezrzade
  • INSERT AFTER 或 UPDATE AFTER 触发器内的回滚是否会回滚整个事务

    INSERT AFTER 或 UPDATE AFTER 触发器内的回滚是否回滚整个事务或仅回滚作为触发器原因的当前行 这与 Commit 相同吗 我尝试通过当前使用 MSTDC 进行事务的项目代码进行检查 看起来好像整个事务已中止 如果触发
  • 语义网框架

    有哪些语义 Web 框架 每个框架有哪些优点 缺点 我已经广泛使用了Jena 我看过Sesame简要地 还有其他我应该考虑的吗 Redland是一个很好的RDF框架 就像Andreas说的 我主要使用它的 Python 绑定 并通过 Mac
  • Laravel 变形关系

    我有一个关于在 Laravel 中保存多态关系的问题 这是我想在 laravel 中创建的模型 商店有很多产品 产品可以是 商品 活动 或 服务 我有以下表格 shops id user id name events id public t
  • 为 https 运行 Tomcat7

    当我在tomcat 7 0的server xml中更改https以进行安全连接时
  • 在加载时设置 Google 图表宽度

    我有这个我的网站上的谷歌图表 目前这是一个散点图 但我想要所有类型图表的解决方案 例如 如果您使用 700 像素宽的窗口加载网站 则图表尺寸不会响应 图表太宽 下面是我正在使用的代码 HTML div div CSS chart div w
  • 有检查 WCF 服务是否在线的示例吗? [复制]

    这个问题在这里已经有答案了 我将有一个使用 WCF 服务代理的客户端应用程序 该客户端将是一个 Windows 窗体应用程序 对某个地址的 N 个端点执行 basicHttpBinding 我想要解决的问题是 当任何 Windows 窗体应
  • Laravel 5 中的自定义分页视图

    拉拉维尔 4 2可以选择指定自定义视图app config view php例如 Pagination View This view will be used to render the pagination link output and
  • 如何在jsp文件中打印java字符串[重复]

    这个问题在这里已经有答案了 我正在尝试通过 jsp 文件打印字符串变量 这是我的代码
  • OpenGL 上下文之间可以共享什么以及如何启用共享

    我正在制作一个 CAD 软件 它将为相似的视图创建不同的 OpenGL 上下文 如果它们没有显示相同的内容 我想在 OpenGL 上下文之间共享尽可能多的数据 尤其是 VBO 和着色器 我想知道what我可以分享和how我分享它们 在一个跨
  • 如何使用 lambda 实现计数器?

    我可以使用一个计数器来实现lambdapython 中的函数或一些更Pythonic 的表达式 这是我的代码 counter 0 if 0 lt arrival time counter 1 else pass 这是我尝试过的 count
  • 具有布尔返回值的 jQuery UI 对话框 - true 或 false

    我正在尝试替代javascript确认 我找到了可以完全自定义的 jquerydialog 函数 问题是我无法让它返回true or false 这是我的代码 delBox dialog autoOpen false resizable f
  • Android Studio 3.1.3 存在约束布局问题

    我试图在这里开始一个新项目 但出现了这个问题 我可以运行该项目并将其部署在模拟器中 但是这个渲染问题和使用私有资源让我很恼火 我已经尝试了互联网上找到的所有可能的解决方案 但它无法解决问题
  • 两个指针变量之间的差异[重复]

    这个问题在这里已经有答案了 我在笔试中问过这个问题 在我的 lapi 上运行以下代码时 我得到 10 作为输出 include
  • 如何按降序对 Plotly 条形图进行排序

    I have created a basic bar chart in plotly that I would like to sort by descending order 我找不到在绘图语法中指定这一点的简单方法 因此我尝试使用 Pa
  • 按钮点击返回值

    当我单击 PyQt 中的按钮时 我很难从调用的函数返回一个值 这就是我想为变量赋值的方式 file path self Button open clicked connect self OpenTextFile 整个函数如下所示 def O
  • Android SimpleDateFormat,如何使用?

    我正在尝试使用AndroidSimpleDateFormat像这样 String Date 2010 09 29 08 45 22 SimpleDateFormat fmt new SimpleDateFormat yyyy MM dd t
  • 是否可以以无点形式编写模式匹配函数?

    考虑以下 Haskell 代码 data Keypress Keypress Int Char getSeq Keypress gt Char getSeq Keypress i c replicate i c 有什么办法可以写getSeq
  • 关于用友元函数查找名字的问题

    我已阅读 basic lookup unqual 的标准部分 对此我感到困惑 typedef int f namespace N struct A friend void f A operator int void g A a int i