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

标签 c++ c++17

下面在全局命名空间中定义了一个友元函数,并将该函数声明为友元

class Cls {
    friend void func(int) { }
    friend void ::func(int);
};

clang accepts这个,同时gcc rejects

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 错误非常明确地表明不喜欢它只是成为 friend 。谁是对的?

最佳答案

来自[namespace.memdef]/3 :

The friend declaration does not by itself make the name visible to unqualified lookup or qualified lookup.

声明:

friend void func(int) { }

确实在全局命名空间中声明名称func。但是,无论是非限定查找还是限定查找都无法找到该名称。它只能通过 ADL 找到(由于参数是 int,意味着根本找不到它 Casey 是铁眼无情的导弹人)。

让普通查找找到此 func 的唯一方法是在类主体之外另外为其提供声明。

gcc 拒绝是正确的。

关于c++ - 声明在早期友元定义中定义的友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54055638/

相关文章:

c++ - 启用/禁用QComboBox/QSpinBox时如何停止发出信号?

c++ - 替换 getchar 的返回值

c++ - cout 在控制台窗口中单击鼠标时挂起

c++ - 如何根据构造函数参数为类成员函数模板化代码

c++ - 在 C++ 中,为什么我不能编写这样的 for() 循环 : for( int i = 1, double i2 = 0;

c++ - 为什么这段代码不影响输出?

c++ - 无法为 std::variant 流式传输带有重载 operator<<() 的 std::endl

c++ - 在 Xcode 中使用 std::variant

C++17 复制构造函数,std::unordered_map 上的深度复制

c++ - 指向非指针编译错误的唯一指针