C++ 通过using声明将函数交朋友合法吗?
以下内容被GCC 4.7.2、GCC 4.8.0和ICC 13.0.1拒绝C++ 通过using声明将函数交朋友合法吗?,c++,language-lawyer,C++,Language Lawyer,以下内容被GCC 4.7.2、GCC 4.8.0和ICC 13.0.1拒绝 namespace A { namespace B { void C(); } using B::C; } class D { friend void A::C(); }; 此外,它还崩溃了Clang3.2(!)。我已经提交了一份错误报告,对于崩溃错误,我不能100%确定这段代码是否真的有错误,因为我在§7.3.3[namespace.udecl]或§11.3[clas
namespace A {
namespace B {
void C();
}
using B::C;
}
class D {
friend void A::C();
};
此外,它还崩溃了Clang3.2(!)。我已经提交了一份错误报告,对于崩溃错误,我不能100%确定这段代码是否真的有错误,因为我在§7.3.3[namespace.udecl]或§11.3[class.friend]中找不到明确解决此问题的任何内容,但是,在各种名称说明符术语的定义中,我可能遗漏了一些东西
此外,似乎所有四个编译器都接受以下内容:
这两个案例似乎没有什么根本性的不同,所以我很好奇GCC和ICC拒绝第一个案例而不是这一个的理由是什么,如果有的话。熟悉该标准的人能找到解决这个问题的方法吗
这绝对是一个小问题,最多,但因为我正在修补它,我想确定我做的是正确的事情
编辑:
新编辑:Johannes下面的回答解释了我的原始示例被拒绝的原因,但似乎没有解释GCC和ICC也拒绝以下内容的原因:
8.3p1:
当声明器id被限定时,
该声明应引用该限定符所指向的类或命名空间的先前声明的成员
引用(或者,对于命名空间,引用该命名空间(7.3.1)的内联命名空间集的元素)
或其专门化成员不应仅通过使用声明介绍
在由declarator-id的嵌套名称说明符指定的类或命名空间的范围内。
A
foo类代码>或类foo::bar
不包含声明器id,因此不受此规则的影响。相反,foo::bar
是一个精心设计的类型说明符(7.1.6.3)的一部分。那么为什么类版本是ok的呢?ok,+1对我来说很有意义。这也是一件好事,否则这将需要更多的努力来解决:不过我不知道其原理。这正是规范中出现的规则。如果这对您有帮助,我很高兴。不,我真的不在乎,只是确保我做了正确的事情:)如果您想详细说明声明器id和详细说明的类型说明符之间的区别,这可能会对遇到此问题的其他人有所帮助,如果没有,我就自己读一读。嘿,你能看看我最近的编辑,看看你能不能找出GCC和ICC拒绝它的原因?它不使用限定名称。
namespace A {
namespace B {
class C;
}
using B::C;
}
class D {
friend class A::C;
};
namespace A {
namespace B {
void C();
}
using B::C;
class D {
friend void C();
};
}