声明在早期友元定义中定义的友元函数

Declare friend function which is defined in an earlier friend definition

本文关键字:定义 友元 函数 声明      更新时间:2023-10-16

下面在全局命名空间中定义了一个友元函数,声明该函数与友元函数相同

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 拒绝是正确的。