通过using声明将函数设为友合法吗?
Is it legal to friend a function via a using declaration?
以下(这里的LiveWorkspace)被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崩溃。我已经提交了一个bug报告和补丁,对于崩溃的bug,但我不能100%确定这段代码是否真的是错误的,因为我在§7.3.3[命名空间]中找不到任何东西。udecl]或§11.3 [class.friend]明确地解决了这种情况,但可能在各种名称说明符术语的定义中有我遗漏的东西。
此外,似乎所有四个编译器都接受以下内容(这里是LiveWorkspace):
namespace A {
namespace B {
class C;
}
using B::C;
}
class D {
friend class A::C;
};
这两种情况似乎没有什么根本不同,所以我很好奇GCC和ICC拒绝第一个例子的理由是什么,而不是这个例子,如果有的话。有更熟悉标准的人能找到解决这个问题的方法吗?
这绝对是一个小问题,但既然我正在修补它,我想确保我做的是正确的…
EDIT:这是补丁现在clang/trunk!
NEW EDIT:下面Johannes的回答解释了为什么我的原始示例被拒绝,但它似乎没有解释为什么GCC和ICC也拒绝以下(这里的LiveWorkspace):
namespace A {
namespace B {
void C();
}
using B::C;
class D {
friend void C();
};
}
8.3p1:
当声明符id被限定时,声明应引用限定符所指向的类或命名空间的先前声明的成员引用(或者,在命名空间的情况下,引用该命名空间(7.3.1)的内联命名空间集的一个元素)或其专业化;成员不能仅仅通过using声明引入在由声明符id的嵌套名称说明符指定的类或命名空间的作用域中。
class foo;
或class foo::bar;
不包含声明符id,因此不受此规则的影响。相反,foo::bar
是详细类型说明符(7.1.6.3)的一部分。
相关文章:
- 我可以在using声明中正确使用C++20概念吗
- using声明不能引用类成员
- 是否可以在 using 声明中引用用户定义的转换模板?
- 是否可以为成员的方法编写类似于固有方法的 using 声明?
- 指定面向具有相同名称的不同函数的类内 using 声明
- 引用 using 声明引入的功能的句子是什么意思?
- 通过派生类模板参数指定基类模板参数之一。如何使用基类的 using 声明
- 在 C++ 中使用关键字 using 声明模板化函数指针的语法
- 何时使用using声明
- 为什么使用using声明引入的私有基类中的成员模板不可访问
- 'using'声明为SFINAE
- using声明如何减少可用于在没有 ADL 的情况下查找的名称
- 如何使用"using"声明模板基类的模板方法?
- C++模板基类的非类型函数模板的 using 声明
- 是否有技术原因不允许using声明以不同的名称访问函数名
- 使用"using"声明隐藏基类方法不适用于赋值运算符
- C++运算符 () 和'using'声明:左操作数必须是 l 值错误
- Q_ENUMS和using声明不能一起工作
- 模板'using'声明不起作用
- 通过using声明将函数设为友合法吗?