声明在早期友元定义中定义的友元函数
Declare friend function which is defined in an earlier friend definition
下面在全局命名空间中定义了一个友元函数,声明该函数与友元函数相同
class Cls {
friend void func(int) { }
friend void ::func(int);
};
Clang接受这一点,而GCC拒绝
so.cpp:3:17: error: ‘void func(int)’ has not been declared within ‘::’
friend void ::func(int);
^~
so.cpp:2:17: note: only here as a ‘friend’
friend void func(int) { }
^~~~
这看起来对我来说应该没问题,它在全局命名空间中定义一个函数,不是吗?gcc错误非常明确地表明不喜欢它只是朋友。谁是对的?
From [namespace.memdef]/3:
友元声明本身不会使名称对非限定查找或限定查找可见。
宣言:
friend void func(int) { }
在全局命名空间中声明名称func
。但是,非限定或限定查找都找不到该名称。它只能通过ADL找到(由于论证西是钢铁般的导弹人)。int
,这意味着根本找不到凯
让普通查找找到此func
的唯一方法是在类主体之外为它提供声明。
GCC 拒绝是正确的。
相关文章:
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- 未定义的类模板不会实例化以检查友元函数
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- 具有定义模板还是非模板的友元函数
- 为什么T是未定义的?我正在尝试实现一个用于双链表的节点类,它不喜欢我使用友元运算符后的T
- 模板和隐式构造函数的类定义之外的友元声明
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- 如何获取指向模板类中定义的友元函数的函数指针
- 在 c++ 中定义命名空间中模板类的友元函数时出现问题
- 当类和函数具有单独的模板参数时,在类定义之外定义友元函数
- 获取内联定义的友元函数的地址
- 我可以有一个从外部不可见但未在标头中定义的静态友元函数吗?
- 如何正确定义无友元函数
- 如何在局部类中定义友元函数运算符>>?
- 在类中定义友元用户定义的文字运算符
- 在类内定义友元函数模板的情况下,如何避免重定义错误
- c++必须在头文件中定义友元函数