使用内部类型的声明

时间:2015-10-19 11:01:16

标签: c++

使用类成员声明的原因是什么只允许作为成员声明?我做不到

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,但接受的答案是禁止的,因为标准是这样说的。我想知道它背后是否有任何技术原因。在其中一条评论中,据说

  

使标准(以及所有编译器)更加复杂   处理一个不方便的案例,有一个方便的解决方法,但没有   通过成本效益测试。

我想说这是一种观点,而不是一种观点。改变它使语言变得更加统一是一个巨大的好处。现在,你必须教导不同的事情来做同样的事情。如果删除该子句,标准将变得更简单,因为大小减小了,但也因为删除了(缝合任意)特殊情况。

更确切地说,我正在寻找技术原因为什么不允许这样做,例如这些地方会产生歧义或其他问题。

1 个答案:

答案 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

它们可以是相同的,它们是不同的东西。