为什么通过ADL发现好友功能成功

2024-03-28

考虑以下代码:

#include <stdio.h>

class A
{
public:
    friend void foo(A a){ printf("3\n"); }
};

int main()
{ 
    foo(A());
}

有用。但我认为这段代码是无效的。这是因为3.4.1/3:

为了确定(在解析期间)表达式是否是 函数调用的后缀表达式,常用的名称查找规则申请。

通常的名称查找规则无法找到友元函数,因为在我的情况下,友元声明的名称在全局命名空间中不可见。实际上是3.3.1/4:

好友声明(11.3)可能会引入一个(可能不可见的)名称 进入封闭的命名空间

这意味着该程序格式不正确。这是因为在判断的时候没有找到名字就是这个表达式foo(A());是函数调用的后缀表达式。

我很困惑...


解析下面的程序时

#include <iostream>
using namespace std;

typedef int foo;

class A
{
public:
   operator int(){
    return 42;
   }
};

int main()
{ 
    cout << foo(A());
}

输出将是42因为3.4.1/3

为了确定(在解析期间)表达式是否是 函数调用的后缀表达式,通常的名称查找规则 申请。

这意味着:确定是否foo是后缀表达式(例如强制转换)或函数调用,编译器将首先使用名称查找并在全局命名空间和/或封闭范围/基类中搜索它(或使用完全限定的查找,如果可用)。

现在使用这段代码:

#include <iostream>
using namespace std;

class A
{
public:
   friend int foo(A a){ return 55; }

   operator int(){
    return 42;
   }
};

int main()
{ 
    cout << foo(A());
}

上面会输出55谢谢ADL http://en.wikipedia.org/wiki/Argument-dependent_name_lookup: foo 将通过在其潜在参数定义的范围内搜索来找到,即 A.

好友声明引入了您发布的名称(可能不可见)(3.3.1/4)

好友声明(11.3)可能会引入一个(可能不可见的)名称 进入封闭的命名空间

这意味着下面的代码将不起作用

#include <iostream>
using namespace std;

class A
{
public:
   friend int foo(A a){ return 55; }

   operator int(){
    return 42;
   }
};

int main()
{ 
    cout << ::foo(A()); // Not found
    cout << A::foo(A()); // Not found
}

您可能想要搜索“好友姓名注入“和/或巴顿-纳克曼技巧 http://en.wikipedia.org/wiki/Barton%E2%80%93Nackman_trick。 简短的故事:现在普通的查找无法找到好友声明。

因此,您发布的代码格式良好,因为 ADL 允许它按照我在前面的段落中解释的方式运行。

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

为什么通过ADL发现好友功能成功 的相关文章

随机推荐

  • 如何使用 Helix Toolkit 在 WPF 中导入 3D 模型?

    我正在尝试使用 Helix Toolkit 导入 3D 模型 我不知道该怎么做 是否有关于使用此工具包导入 3D 模型的在线指南 或者是否有除 Helix 之外的其他更简单的方法来导入 3D 模型 Regards 这是我的代码 using
  • Python 3.3:使用nose.tools.assert_equals时出现DeprecationWarning

    我正在使用nosetest工具来断言pythonunittest https docs python org 3 3 library unittest html from nose tools import assert equals as
  • 查找 img 在 jquery 中是否有 alt,如果没有,则从数组中添加

    首先需要找到网站中的所有img body find img 然后检查img是否具有 alt 属性 如果图像具有该属性 它将被转义 如果它没有或alt为空 将从列表或数组中随机添加一个字符串到img 我现在必须在函数中使用 each 但我对
  • 防止 UIScrollView 将内容移动到左上角

    我有一个UIImageView包含在一个UIScrollView 图像 通常 很大 因此用户可以将其缩小以查看整个图像 不过 缩小后 UIScrollView捕捉到ImageView到滚动视图的左上角 我希望用户可以定位它 但还没有找到 关
  • 为什么在 GaussianNB [scikit-learn] 中使用对数概率估计?

    我目前正在使用 scikit learn高斯NB http scikit learn org stable modules generated sklearn naive bayes GaussianNB html包裹 我注意到我可以选择几
  • 在 Doxygen 中引用参数的正确方法是什么?

    我有以下 Doxygen 函数文档 brief Does interesting things param in pfirst The first parameter a barrel full of monkeys pre pfirst
  • 从 Nim 中的 tar.gz 存档中读取文件

    寻找一种使用 Nim 编程语言 版本 0 11 2 从 tar gz 存档中读取文件的方法 说我有一个档案 my path to archive tar gz 以及该存档中的一个文件 my path to archive file txt
  • NamingException:jta.UserTransaction

    我有一个直接使用 Java Transaction API 资源的 hibernate 应用程序 我正在尝试使用 UserTransaction 来完成一些基本的数据库事务 UserTransaction 接口定义了允许 应用程序显式管理事
  • html输入范围拇指平滑移动

    我设置了一个 HTML 输入范围 对外观进行了一系列 CSS 更改 我想知道是否有任何方法可以使其从所在位置平滑地更改为用户更改的位置 input type range webkit appearance none width 100 he
  • 为什么通用列表的声明存在差异?

    我想声明两个列表 首先是一个整数列表 我将其声明为 List
  • Magento - 在控制器和块之间传递数据

    非常快速和简单的问题 但我找不到一个合适的答案 将数据从控制器传递到 Magento 中的块的最佳方法是什么 如果它有所不同 我将按如下方式加载布局 this gt loadLayout array default myModule def
  • 针对 JavaScript 中的多个正则表达式测试字符串

    我想针对 20 个左右的正则表达式测试给定的字符串 在 Javascript 中执行此操作的干净方法是什么 我更关心干净的代码和可读性而不是效率 但我也不希望它变得超级慢 现在我有 if href indexOf apple com gt
  • 如何更改四开中代码块的字体大小?

    我在用quarto准备 Beamer 演示文稿 我想减小给定块内代码的字体大小 以便一切都更合适 请参阅下面的示例 生成块的代码是 python Import packages import numpy as np python echo
  • 使滚动条出现在滚动条轨道悬停时

    我通过 CSS 使用自定义滚动条样式在 webkit 中实现自定义滚动条 如果其他浏览器已实现带前缀或不带前缀的版本 版本 请告诉我 但是 关于我的问题 有没有办法让滚动条出现在滚动条轨道的悬停上 有点像 Mac OS X Lion 和 M
  • ASP.Net MVC 将特定路由重定向到外部站点

    我有一个功能良好的 ASP Net MVC 站点 使用简单的标准路由方案 routes MapRoute Default controller action id new controller Home action Index id 我的
  • 有效的java构建器习语在c++中等效吗?

    这是自从阅读 Effective Java 以来我一直在使用的一个很棒的习惯用法 我一直在尝试寻找 C 的等价物或类似的东西 但运气不佳 GoF 书中找到的传统构建器模式并不真正适用于我的情况 这是一个复杂的对象 具有非常混乱的构造函数 下
  • 如果构造函数抛出异常,是否会调用析构函数?

    寻找 C 和 C 的答案 在 C 中 将 析构函数 替换为 终结器 它适用于 C 请参见下面的代码 但不适用于 C using System class Test Test throw new Exception Test Console
  • 供需模型

    我想我应该请求 SO 社区帮助我完成我目前正在进行的一个项目 我需要在市场情况下对小部件的价格进行建模 小部件的价格应该是当前供求关系的结果 用户将能够以固定价格购买和出售该小部件 当用户购买该小部件时 需求将随着价格上升 相反 当用户出售
  • 在 Android 中从数组列表中检索元素?

    我正在尝试在 Android 中实现语音识别代码 如何从 Android 数组列表中获取特定位置的元素 我尝试转换arraylist to array并检索 代码仍然无法正常工作 package com espeaker public cl
  • 为什么通过ADL发现好友功能成功

    考虑以下代码 include