【发布时间】:2021-05-24 22:39:33
【问题描述】:
我无法弄清楚标准如何消除 sizeof expressions 的歧义,这可能是(除其他外):
sizeof一元表达式sizeof(type-id)
例如,我想知道标准如何区分
一元表达式
sizeof
一元表达式 ... 主表达式(
表达式 ... 主表达式, id-expression, unqualified-ididentifier)
和
一元表达式
sizeof(
type-id ... simple-type-specifier, type-name, typedef-nameidentifier)
其他可能是标识符的类型名称也会出现类似的歧义,我想了解这如何映射到标准。
[编辑]
澄清一下:我能够很好地根据它们的声明方式(typedef、类等)来区分 type-name 的标识符 - 但是我目前看不到 id -expression(或其包含的 unqualified-id)在另一个解析可能匹配 type-id 时消除歧义。正如在 cmets 中提出的那样,针对特定情况存在各种规则来消除表达式与类型 ID 的歧义,但我还没有看到它们如何扩展到这种特定情况(除非您推断并假设类型 ID 总是胜过表达式,这已被建议作为对 cmets 中消歧规则的可能解读)。
[end edit]
我的想法是寻找关于什么标识符可以是 id-expression 的任何约束,但我找不到任何具体的东西,我能看到的最接近约束的是非常无用的措辞在5.1.1/8
标识符是一个 id 表达式,前提是它已被适当声明(第 7 条 [dcl.dcl])。
查看提到的部分,我找不到参考的含义,在网上我只找到了this question,但答案并没有详细说明
该短语的目的是禁止在表达式中使用未声明的标识符。
所以要么解决的方式与我想的不同,要么“适当地宣布”我失踪了。
PS:使用 C++14 标准没有什么特别的原因,它正是我当时一直在使用的,对于新标准的答案也一样好。自己检查新标准中提到的部分似乎没有任何明显的澄清。
【问题讨论】:
-
@T.C.我看不出这将如何解决标识符的解释,因为不涉及函数样式转换;两个语法规则都严格简化为一个标识符。
-
它首先讨论了函数样式转换,但它制定的消歧规则更笼统:任何可以是 type-id 的东西都是 type-id。
-
@T.C.好的,我现在知道您是如何阅读它的,但是如果打算建立一般裁决,这是非常奇怪的措辞。在它的段落中,它描述了一个模棱两可的地方,然后说“[这个模棱两可的]解决方案是……”,所以期望读者假设一个普遍的裁决是有问题的。感谢您指出这一点!
-
那...实际上并不是如何消除 template-argument 的歧义:timsong-cpp.github.io/cppwp/n4861/temp.arg#2
标签: c++ language-lawyer