函数名解析不正确的全局命名空间说明符

Global namespace specifier for function names parsing incorrectly with typedefs?

本文关键字:全局 命名空间 说明符 不正确 函数      更新时间:2023-10-16

我遇到了一个奇怪的clang问题,可能是也可能不是一个bug。

下面的代码片段在clang 4.2上无法编译,但在gcc上可以,因为它将"baz::test"解析为返回类型。

typedef int baz;
namespace foo { class bar; }
baz test(foo::bar &);
namespace foo {
    class bar {
    private:
       int f;
       friend baz ::test(bar &);
    };
}

friend int ::test(bar &)可以编译,friend baz (::test)(bar &)也可以。

我浏览了一些标准,试图看看clang的行为是否正确,但没有获得太多的见解。这是clang中的bug吗?

《标准报》确实说过

friend baz ::test(bar &);

friend baz::test(bar &);

是等价的。

但是,我认为它们应该同时编译。