使用内部类型声明
Using declaration for inner types
只允许将类成员的声明用作成员声明的原因是什么?我不能做
struct Outer
{
typedef int Inner;
};
void f()
{
// this doesn't work with C++14
using Outer::Inner;
}
,但我认为这与使用声明符将在其他地方声明的名称引入当前区域的预期语义是相当正交的。它受到c++标准
的明确限制7.3.3/8:类成员的using声明应该是成员声明
,但我想知道为什么。
我认为如果允许内部类型(typedef,类等)并定义为与
相同,将使语言更加规则。// using Outer::Inner should be identical to
using Inner = Outer::Inner
,这与名称空间的行为相同。
我知道以前有人问过这个问题,但公认的答案是禁止这样做,因为标准是这样规定的。我想知道这背后是否有技术上的原因。在其中一条评论中,有人说
使标准(以及所有编译器)更加复杂处理一个不寻常的情况,有一个方便的解决方案,只是没有通过成本效益测试
我认为这是一种观点而不是一种论点。改变它使语言变得更加统一是一个巨大的好处。现在,你必须教不同的东西来做同样的事情。如果您删除了子句,标准将变得更简单,不仅因为大小减小了,而且还因为删除了一个(看似任意的)特殊情况。
更准确地说,我正在寻找技术原因为什么这是不允许的,例如,它会产生歧义或其他问题的地方。
不要混淆using声明和alias声明。using A = B;
是一个别名声明,语义上与类型定义相同:
类型名也可以通过analias-declaration。的标识符后,使用关键字变成了一个类型名还有可选的attribute-specifier-seq后,标识符与此相关类型名。它具有相同的语义,就好像它是由类型定义说明符。特别是,它没有定义一个新的类型,它不应该出现在id类型.
所以你写using Inner = Outer::Inner
是因为它和typedef Outer::Inner Inner
一样,而不仅仅是typedef Outer::Inner
。别名声明为类型名创建别名。
using-declaration是不同的:它将一个名称引入作用域(7.3.3/1),但它也被单词using
调用,这有点令人困惑。
//使用Outer::Inner应该与using Inner = Outer::Inner
它们不可能相同,它们是不同的东西
- std::enable_if 更改成员 *变量* 声明/类型
- 对前向声明类型进行unique_ptr的解决方法
- 如何将声明类型作为参数发送
- 在 Fortran 中泛化特定声明类型的操作
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- 模板函数可以使用带有删除的构造函数的声明类型
- 声明类型没有任何可变类型
- 如何使用声明类型简化此代码
- 使用声明类型选择函数专业化
- 替代班级内声明类型的别名
- 对于自动键入推论的参数,声明类型(自动)应推导的内容
- 使用 decltype 的条件声明类型
- 您如何声明类型结构的堆栈?在C 中
- 将指向前向声明类型的指针推送到 typedef'd 向量时出现编译器错误
- 声明适用于 auto,但不能显式声明类型?
- 声明类型包含未展开的参数包'Args'
- 课堂上的Typedef.在另一个类错误中:尚未声明类型
- 冲突的声明类型/价值不匹配
- 获取具有AST访问者clang的功能声明类型
- 变量声明类型定义 C 中的约定