声明在较早的朋友定义中定义的朋友功能

时间:2019-01-05 19:47:03

标签: 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错误很明显是关于不喜欢only做朋友。谁是对的?

1 个答案:

答案 0 :(得分:5)

来自[namespace.memdef]/3

  

朋友声明本身不会使名称对不合格查询或合格查询可见。

声明:

friend void func(int) { }

确实在全局名称空间中声明名称func。但是,不能通过非限定或限定查找来找到该名称。它只能通过ADL找到(,由于参数为int,因此根本找不到它。 Casey是一个铁眼的导弹人)。

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

gcc是正确的拒绝对象。