我很难弄清楚标准如何消除sizeof 表达的歧义,这可以是(除其他外):
sizeof一元表达式sizeof(type-id)
例如,我想知道标准将如何区分
一元表达式
sizeof一字一句.初级表达(表情..。主表达式id表达式不合格ididentifier)
和
一元表达式
sizeof(类型-身份..。简单类型说明符,类型名称,类型名称identifier)
对于其他类型的名称也会出现类似的歧义,它们可以是标识符,我想了解这是如何映射到标准的。
编辑
为了澄清:我非常能够根据声明类型名称的方式来消除标识符的歧义,但是,我目前还没有看到id-表达式(或其包含的非限定-id)在另一个解析可能匹配类型-id时如何消除歧义。正如注释中提到的那样,对于特定情况,消除表达式与类型id之间的歧义存在着各种规则,但我还不知道它们如何扩展到这种特定的情况(除非您推断并假设类型id总是胜过表达式,这已经被建议作为注释中消歧规则的一种可能阅读方式)。
端编辑
我的想法是寻找任何关于标识符可以是id表达式的约束,但是我找不到任何具体的限制,我能看到的最接近约束的是5.1.1/8中非常无用的短语。
一个标识符是一个id表达式,只要它已经被适当的声明(第7条dcl.dcl)。
在上面提到的部分中,我找不到引用的含义,在网络上我只找到了这个问题,但答案并没有超出细节
该短语的用意是不允许在表达式中使用未声明的标识符。
所以,要么这一问题的解决方式与我所想的不同,要么就必须有更多的意义来“适当地宣布”我错过了。
PS:使用C++14标准没有什么特别的原因,这正是我当时一直在做的,一个新标准的答案也一样好。检查更新标准中提到的部分,我自己似乎没有任何明显的澄清。
发布于 2021-05-25 04:33:37
这就是雷克萨斯黑客:标识符是不限定的id、类型名称还是模板名称,都是根据已经处理的声明或依赖上下文中的typename和template解析器指南来确定的。这是区分的唯一方法,比如说,将A * b;解释为指针的简单声明或抛弃乘法结果的表达式语句。
关于这一点,标准是非常模糊的:它仅仅提到了在class.pre-1这样的地方出现在声明中的标识符的解释:
它的名称成为其作用域内的类名(class.name)。
温帕拉姆/3:
它的标识符不跟随省略号的类型参数将其标识符定义为模板声明范围内的ty胡枝子名称(如果声明没有
template)或模板名称(如果用template声明)。
本地/1,其中它还依赖于语法:
注入的类名可以用作模板名或类型名称.
和tem.name/3,其中它是注释的一部分,因为规范文本指定了对<的解释
[注1:如果名称是标识符,则解释为模板名称。…- end注记]
https://stackoverflow.com/questions/67679664
复制相似问题