2015-10-19 87 views
2

为类成员使用声明仅允许作为成员声明的原因是什么?我不能做使用内部类型的声明

struct Outer 
{ 
    typedef int Inner; 
}; 

void f() 
{ 
// this doesn't work with C++14 
    using Outer::Inner; 
} 

,但我认为这将是使用-陈述句引进宣布其他地方到当前区域名称的预期语义相当正交的。它是明确的C++标准

7.3.3/8的限制:using声明的类成员须为 成员声明

,但我不知道为什么。

我认为这使语言更加规则,如果它是允许内部类型(类型定义,类等),并定义为相同

// using Outer::Inner should be identical to 
using Inner = Outer::Inner 

,这是相同的名称空间的行为。

我知道这个问题has been asked before,但接受的答案是被禁止的,因为标准是这样说的。我想知道它背后是否有任何技术原因。在一个评论,它说,

制定标准(因此所有的编译器)更复杂的 处理,有一个方便的解决方法的不寻常的案件只是不 通过成本效益的测试。

我会说这是一个意见,而不是一个论点。改变它使语言变得更加统一是一个巨大的好处。现在,你必须教同样的事情做不同的事情。如果删除该子句,则标准将变得更简单,这既是因为尺寸缩小了,也是因为删除了(接缝任意)特殊情况。

更确切地说,我在寻找技术原因为什么这是不允许的,例如,这会造成模棱两可或其他问题。

+1

这也是被接受的答案。 Quote:'使标准(并因此所有的编译器)更复杂,以处理一个有一个方便的解决方法不寻常的情况下,只是没有通过成本效益测试。' – user2079303

+0

@ user2079303我已经扩展了答案与我的论点为什么这情况并非如此。 – Jens

+0

我没有看到你正在寻找的东西,但这个问题还没有被涵盖。我正在关闭作为一个笨蛋。如果你真的想得到更多的细节,请给它一个奖励,但你不会得到任何。 –

回答

1

不要混淆使用声明和别名声明。 using A = B;别名声明,其语义是相同的一个typedef:

甲 的typedef名 也可以通过一个 别名声明 引入。所述 标识符 的 使用 关键字 以下成为 的typedef名 和可选 属性说明符-SEQ 继 标识符 appertains到 的typedef名 。它具有与 typedef 说明符所引入的相同的语义。特别是,它 没有定义新的类型,它不应出现在 type-id 中。

所以,你写using Inner = Outer::Inner,因为它是一样的typedef Outer::Inner Inner,不只是typedef Outer::Inner。一个别名声明为一个类型名称创建一个别名。

using声明,在另一方面,是不同的东西:它引入了一个名字进入范围(7.3.3/1),但它也由字using,这是有点混乱调用。

所以,

//使用外::内使用内=外应该是相同的 ::内

它们不能是相同的,它们是不同的事情。

+0

我指的是使用声明,例如'使用命名空间std :: chrono :: miliseconds',将名称导入当前范围。现在,我希望能够在'使用Inner :: Outer'方法中做到这一点,这在成员声明中是可能的,但不能在作用域块中使用。我想知道为什么,因为我没有看到这个原因。别名声明将是预期的语义。 – Jens