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

Rya*_*ing 1 c++ c++17

下面定义全局命名空间中的友元函数,声明与朋友相同的函数

class Cls {
    friend void func(int) { }
    friend void ::func(int);
};
Run Code Online (Sandbox Code Playgroud)

铛接受这一点,而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) { }
                 ^~~~
Run Code Online (Sandbox Code Playgroud)

这对我来说应该没问题,它在全局命名空间中定义一个函数不是吗?gcc错误很明显,不喜欢它only是朋友.谁是对的?

Bar*_*rry 5

来自[namespace.memdef]/3:

友元声明本身不会使名称对非限定查找或限定查找可见.

声明:

friend void func(int) { }
Run Code Online (Sandbox Code Playgroud)

确实func在全局命名空间声明了名称.但是,无法通过不合格或合格的查找找到该名称.它只能通过ADL找到(因为论证的int意思是,所有 Casey 都无法找到它是钢铁般的导弹人).

普通查找的唯一方法func就是在类体之外另外提供一个声明.

gcc拒绝是正确的.

  • "因为参数是'int`,所以它根本无法找到"[接受挑战](https://godbolt.org/z/klySDp). (2认同)