【问题标题】:Why type alias is allowed as name of variable? [closed]为什么允许类型别名作为变量名? [关闭]
【发布时间】:2020-10-06 12:45:43
【问题描述】:

什么规则使得下面的代码compile without error:

using integer = int;

struct Foo
{
    int integer;
};

int main() {
    Foo f;
    int integer;
    f.integer;
}

using 当然不是#define integer int 的简单替代品,但是是什么让这段代码看起来格式正确,而int int; 会导致格式错误?

【问题讨论】:

  • 我不明白为什么这个问题被关闭了。很清楚所要求的内容(即使在从未编辑过的原始问题中),这对我们经常访问语言律师标签的访问者来说很有趣,并且该问题有两个很好的答案,一个带有适当的标准摘录。我几乎给人的印象是,最初的高级代表近距离投票者在下面的近距离投票者自己的答案中没有达成一致意见后,是侵略性地这样做了,海事组织并没有给出任何接近语言律师的答案 (_"这里有一些引述可以帮助您入门,...")。我正在投票重新打开它。

标签: c++ language-lawyer using type-alias


【解决方案1】:

虽然可以访问在外部范围中声明的名称,然后隐藏该名称,这有点令人惊讶,但这只是范围规则的直接应用:

在块 (9.3) 中声明的名称是该块的本地名称;它具有块范围。它的潜在范围始于 声明点(6.3.2)并在其块的末尾结束。 [basic.scope.block]

反过来,名称声明的要点是:

紧跟在它的完整声明符之后(第 11 条)和它之前 初始化程序(如果有)... [basic.scope.pdecl]

所以当您执行integer integer 时,您还没有声明块作用域名称integer,这意味着您仍然可以看到全局integer。这也意味着你不能integer integer = (integer)0

更容易解释为什么int int 无法编译。 int 是一个关键字,因此没有可以将其声明为名称的语法规则;它不符合“名字的样子”的规则。

有五种标记:标识符、关键字、文字、运算符和其他分隔符。 [lex.token]

因为int是关键字,所以不能是标识符,也就是说不能是名字。

【讨论】:

    【解决方案2】:

    代码编译的原因是integer的使用在不同的作用域

    using integer = int; // #1
    
    struct Foo
    {
        int integer;  // #2
    };
    

    请注意,#1 中的 integer#2 之间没有关系。这些用途之间没有冲突,它们也可能有不同的名称。

    Foo 内部,符号integer 仅指变量。如果要引用类型别名,可以在前面加上::,如下所示:

    struct Foo
    {
      ::integer integer;  // ok
    };
    

    如果using 声明和变量在相同范围内,那么你会得到一个错误:

    using integer = int; 
    int integer;          // error, redefinition of symbol 
                          // as different kind of entity
    

    struct Foo
    {
        using integer = int; 
        int integer;         // error, redefinition of symbol 
                             // as different kind of entity
    };
    

    【讨论】:

    • 但这只是因为那时会有两个Foo::integer。在Foo 范围内使用别名不是问题,struct Foo { integer x; int integer; } 是“好的”。无论如何,我放置了语言律师标签,因为我正在寻找标准中的报价
    • @idclev463035818 抱歉,我错过了那个标签,我看看能找到什么。但是struct Foo { integer x; int integer; } 一点都不好。它改变了符号 integer 的含义,即 ifndr。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多