【发布时间】:2013-03-28 21:39:12
【问题描述】:
以下(LiveWorkspace here) 被 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();
};
此外,它还会导致 Clang 3.2 (!) 崩溃。我已经提交了一个错误报告和patch,用于崩溃错误,但我不能 100% 确定这段代码是否真的有错误,因为我在 §7.3.3 [ namespace.udecl] 或 §11.3 [class.friend] 明确解决了这种情况,但也许在我错过的各种名称说明符术语之一的定义中有些东西。
此外,似乎所有四个编译器都接受以下(LiveWorkspace here):
namespace A {
namespace B {
class C;
}
using B::C;
}
class D {
friend class A::C;
};
这两个案例似乎没有任何根本不同,所以我很好奇 GCC 和 ICC 拒绝第一个例子但不是这个例子的理由是什么,如果有的话。任何更熟悉该标准的人都可以找到解决此问题的任何内容吗?
这绝对是一个小问题,但由于我正在修补它,我想确保我做的事情是正确的......
编辑:This is patched now in clang/trunk!
新编辑:Johannes 在下面的回答解释了为什么我的原始示例被拒绝,但似乎没有解释为什么 GCC 和 ICC 也拒绝以下 (LiveWorkspace here):
namespace A {
namespace B {
void C();
}
using B::C;
class D {
friend void C();
};
}
【问题讨论】:
标签: c++ language-lawyer