C++ 对内部类型使用声明

C++ 对内部类型使用声明,c++,C++,为什么对类成员使用声明只能作为成员声明?我做不到 struct Outer { typedef int Inner; }; void f() { // this doesn't work with C++14 using Outer::Inner; } ,但我认为这与使用声明式将在其他地方声明的名称引入当前区域的预期语义是非常正交的。它明显受到C++标准的限制。 7.3.3/8:类成员的使用声明应为 成员声明 ,但我想知道为什么 我认为,如果允许使用内部类型(typedef

为什么对类成员使用声明只能作为成员声明?我做不到

struct Outer
{
    typedef int Inner;
};

void f()
{
// this doesn't work with C++14
     using Outer::Inner;
}
,但我认为这与使用声明式将在其他地方声明的名称引入当前区域的预期语义是非常正交的。它明显受到C++标准

的限制。 7.3.3/8:类成员的使用声明应为 成员声明

,但我想知道为什么

我认为,如果允许使用内部类型(typedef、类等),并将其定义为与

// using Outer::Inner should be identical to
using Inner = Outer::Inner
,这与名称空间的行为相同

我知道这个问题,但公认的答案是,这是禁止的,因为标准上是这么说的。我想知道这背后是否有技术上的原因。其中一条评论说

使标准(以及所有编译器)更加复杂 处理一个不寻常的情况,有一个方便的解决办法,只是没有 通过成本效益测试

我想说这是一种观点,而不是争论。改变它使语言变得更加统一是一个巨大的好处。现在,你必须为做同一件事教不同的东西。如果删除该条款,标准将变得更简单,这不仅是因为尺寸减小了,还因为删除了(任意接缝的)特殊情况


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

不要混淆使用声明和别名声明<代码>使用A=B是一个别名声明,在语义上与typedef相同:

A 类型定义名 也可以由 别名声明 . 这个 标识符 遵循 使用 关键词 成为 类型定义名 和可选的 属性说明符seq 遵循 标识符 属于那个 类型定义名 . 它的语义与 类型定义 说明符。特别是 不定义新类型,且不应出现在 类型id

因此,您可以使用Inner=Outer::Inner编写
,因为它与
typedef Outer::Inner
相同,而不仅仅是
typedef Outer::Inner
。别名声明为类型名生成别名

另一方面,using声明则有所不同:它在作用域中引入了一个名称(7.3.3/1),但它也被单词
using
调用,这有点令人困惑

所以

//使用Outer::Inner应该与 使用内部=外部::内部


它们不可能完全相同,它们是不同的东西。

这也是公认的答案。引用:
使标准(以及所有编译器)更加复杂,以处理一个具有方便解决方法的异常情况,这并没有通过成本效益测试。
@user207933我已经用我的论点扩展了答案,为什么不是这样。我不明白你在寻找什么,这个答案中还没有提到。我快完蛋了。如果你真的想得到更多细节,请悬赏。如果你强烈认为ISO工作组的“意见”不足以实际使用,请提交修改建议。@LightnessRacesinOrbit如问题中所述,我正在寻找技术原因。该标准没有给出任何信息,我也不知道有任何信息,但可能存在导致问题或歧义的原因。通常有一些。我明确地指的是这个问题,但它没有回答我的问题,因为它没有给出除了该子句存在之外的任何理由。我指的是使用声明,例如,
使用namespace std::chrono::milisons
,它将名称导入当前范围。现在,我希望能够使用Inner::Outer对
执行相同的操作,这在成员声明中是可能的,但在范围块中是不可能的。我想知道为什么,因为我看不出这样做的原因。别名声明将是预期的语义。