可以在命名空间范围内定义本地类的友元函数吗?

Can friend function of a local class be defined in namespace scope?

提问人:Fedor 提问时间:8/23/2023 更新时间:8/23/2023 访问量:124

问:

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

这里哪个编译器是正确的?

C++ 语言律师 C++20 好友 本地类

评论

0赞 Some programmer dude 8/23/2023
使用作用域运算符显式使用全局命名空间范围?如::friend void ::bar(const A&);
0赞 273K 8/23/2023
这样的代码缺乏可读性。这样的代码有什么实际用途?
0赞 Language Lawyer 8/23/2023
@Someprogrammerdude限定和不限定的友元函数名称由不同的规则涵盖
1赞 Language Lawyer 8/23/2023
我认为 eel.is/c++draft/dcl.meaning.general#2.3 表明代码没问题
1赞 StoryTeller - Unslander Monica 9/27/2023
话又说回来,有 stackoverflow.com/a/71168429/817643 - 但我不确定这里是否考虑了本地课程

答: 暂无答案