for*_*818 2 c++ using language-lawyer type-alias
什么规则使以下代码编译无错误:
using integer = int;
struct Foo
{
int integer;
};
int main() {
Foo f;
int integer;
f.integer;
}
Run Code Online (Sandbox Code Playgroud)
using当然不是 的简单替代品#define integer int,但是是什么让这段代码看起来格式良好,而int int;会使其格式错误?
虽然可以访问在外部作用域中声明的名称,然后隐藏该名称,这有点令人惊讶,但这只是对作用域规则的直接应用:
在块 (9.3) 中声明的名称是该块的本地名称;它有块作用域。它的潜在作用域从它的声明点 (6.3.2) 开始,并在其块的末尾结束。[基本.scope.block]
反过来,名称声明的要点是:
在其完整声明符(第 11 条)之后和其初始值设定项(如果有)之前...... [basic.scope.pdecl]
因此,当您这样做时integer integer,您还没有声明块范围的名称integer,这意味着您仍然可以看到全局integer. 这也意味着你不能这样做integer integer = (integer)0。
更容易解释为什么int int不能编译。int是关键字,因此没有语法规则可以将其声明为名称;它不符合“名字看起来像什么”的规则。
有五种标记:标识符、关键字、文字、运算符和其他分隔符。[lex.token]
因为int是关键字,它不能是标识符,这意味着它不能是名称。