首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >using声明是否能够引用友元函数

using声明是否能够引用友元函数
EN

Stack Overflow用户
提问于 2018-11-21 18:11:47
回答 1查看 42关注 0票数 2

我有一个类,它在类头中定义了一个friend函数。当我使用声明这个朋友函数时,它在MSVC2017中起作用,但在GCC 8.2或Clang7.0中不起作用。谁是对的?下面是godbolt链接(https://godbolt.org/z/_7MVlh),代码如下:

代码语言:javascript
运行
复制
namespace vec {

class Vec {
    friend Vec vec_max(const Vec& a, const Vec& b) { return a; }
};

}

void test() {
    using vec::vec_max;
}

GCC在using声明中给出了错误:“错误:命名空间‘vec’中没有名为'vec_max‘的成员”。Clang也给出了类似的信息。MSVC按照预期对其进行了编译。

根据我的理解,vec_max应该驻留在vec名称空间中,MSVC应该是正确的。但标准中可能存在一些微妙的文字,使得对gcc和碰的更严格的解释是正确的(尽管不那么直观)。

EN

回答 1

Stack Overflow用户

发布于 2018-11-21 18:16:47

MSVC在这里是错误的。如果友元函数是在类定义内内联定义的,而不是在外部声明的,则不应该通过常规的名称查找找到它,只有依赖于参数的查找才能找到它。

报价C++17 (n4659):

14.3 class.friend

6当且仅当类是非本地类(12.4)、函数名未限定且函数具有命名空间作用域时,才能在类的友元声明中定义函数。..。

7这样的函数隐式地是内联函数(10.1.6)。在类中定义的friend函数在定义它的类的(词法)范围内。在类外部定义的友元函数不是(6.4.1)。

和6.4.2/4 basic.lookup.argdep

考虑关联的命名空间时,查找与将关联的命名空间用作限定符(6.4.3.2)时执行的查找相同,不同之处在于:

  • (4.1) ...
  • (4.2)在关联类中声明的任何命名空间范围的友元函数或友元函数模板在其各自的命名空间中都可见,即使它们在普通查找期间不可见(14.3)。
  • (4.3) ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53409706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档