使用类成员声明的原因是什么只允许作为成员声明?我做不到
struct Outer
{
typedef int Inner;
};
void f()
{
// this doesn't work with C++14
using Outer::Inner;
}
,但我认为这与使用声明的目标语义相当正交,以将在其他地方声明的名称引入当前区域。它明确受到C ++标准的限制
7.3.3 / 8:集体成员的使用声明应为a 成员声明
,但我想知道为什么。
我认为如果内部类型(typedef,类等)被允许并且被定义为与
相同,那么它将使语言更加规则化// using Outer::Inner should be identical to
using Inner = Outer::Inner
,这与命名空间的行为相同。
我知道这个问题has been asked before,但接受的答案是禁止的,因为标准是这样说的。我想知道它背后是否有任何技术原因。在其中一条评论中,据说
使标准(以及所有编译器)更加复杂 处理一个不方便的案例,有一个方便的解决方法,但没有 通过成本效益测试。
我想说这是一种观点,而不是一种观点。改变它使语言变得更加统一是一个巨大的好处。现在,你必须教导不同的事情来做同样的事情。如果删除该子句,标准将变得更简单,因为大小减小了,但也因为删除了(缝合任意)特殊情况。
更确切地说,我正在寻找技术原因为什么不允许这样做,例如这些地方会产生歧义或其他问题。
答案 0 :(得分:1)
不要混淆使用声明和别名声明。 using A = B;
是 alias-declaration ,在语义上与typedef相同:
一个 的typedef名 也可以由一个人介绍 别名声明 。该 识别码 跟着 运用 关键词 成为一个 的typedef名 和可选的 属性符-SEQ 跟着 识别码 与此相关 的typedef名 。它具有相同的语义,就像它被引入一样 的typedef 符。特别是它 没有定义新类型,它不会出现在 类型ID
所以,你写using Inner = Outer::Inner
因为它与typedef Outer::Inner Inner
相同,而不仅仅是typedef Outer::Inner
。 alias-declaration 为类型名称创建别名。
另一方面, using-declaration 是不同的东西:它将一个名称引入范围(7.3.3 / 1),但它也由单词{{1}调用这有点令人困惑。
所以,
//使用Outer :: Inner应该相同 使用Inner = Outer :: Inner
它们可以是相同的,它们是不同的东西。