提问人:Fedor 提问时间:8/23/2023 更新时间:8/23/2023 访问量:124
可以在命名空间范围内定义本地类的友元函数吗?
Can friend function of a local class be defined in namespace scope?
问:
C++ 中的局部类可以有友元函数,但这些函数既不能在类 [class.friend] p6 中定义:
当且仅当类是非本地类且函数名称是非限定的时,才能在类的友元声明中定义函数。
不在封闭函数 [dcl.fct.def.general] p2 中:
[...]函数只能在命名空间或类范围内定义。[...]
但是,是否可以在全局范围内定义局部类的友元函数,如下所示:
auto foo() {
struct A;
void bar(const A&);
struct A {
friend void bar(const A&);
};
bar(A{});
return A{};
}
using A = decltype(foo());
void bar(const A&) {}
Clang 和 MSVC 实际上都允许它,但 GCC 打印了奇怪的错误:
<source>:5:21: error: 'void bar(const foo()::A&)', declared using local type 'const foo()::A', is used but never defined [-fpermissive]
5 | friend void bar(const A&);
| ^~~
<source>:5:21: error: 'void bar(const foo()::A&)' used but never defined
<source>:12:6: warning: 'void bar(const A&)' defined but not used
在线演示:https://godbolt.org/z/Yqoeda94x
这里哪个编译器是正确的?
答: 暂无答案
评论
::
friend void ::bar(const A&);