为何C++标准[dcl.ambig.res]/2示例中int(a)是表达式而int(unsigned(a))是类型标识?
为什么
int(a)是表达式,而int(unsigned(a))被判定为格式错误的类型标识? 嘿,这个问题其实戳中了C++语法里一个很有意思的歧义消解规则,咱们掰开揉碎了说:
首先得明确C++的核心语法原则:当一段代码结构既可以被解析成表达式,又可以被解析成类型标识时,标准默认会优先把它当成类型标识——但有个关键例外,专门用来处理像int(a)这种常见的函数式类型转换场景。
先看sizeof(int(a))的情况
这里的int(a),括号里的a是最基础的表达式(专业术语叫primary-expression,单个变量、字面量、带括号的简单表达式都属于这类)。根据标准[dcl.ambig.res]/2的例外规则:当你写T(E)且E是primary-expression时,会优先把这个结构当成表达式——也就是咱们常说的函数式类型转换:把a转换成int类型。
所以sizeof(int(a))里,sizeof计算的是这个转换后表达式的结果大小(也就是int的字节数),完全合法。
再看sizeof(int(unsigned(a)))的情况
这里的情况不一样了:括号里的内容是unsigned(a),它本身虽然能当成表达式,但它不是primary-expression(它是一个嵌套的转换结构,属于复合表达式)。这时候触发不了上面的例外规则,标准会默认把整个int(unsigned(a))当成类型标识来解析。
按照类型标识的语法,int(unsigned(a))会被理解成「返回int类型、参数是unsigned类型的函数类型」——但问题在于,类型标识里的函数参数列表不需要写标识符(合法写法是int(unsigned())),这里的(a)纯属多余,所以这个类型标识是格式错误的,编译器自然会报错。
一句话总结
- 当
T(E)里的E是单个变量、字面量这种最基础的表达式时,优先按**表达式(类型转换)**处理; - 当
E是更复杂的嵌套结构时,默认按类型标识处理,若这个类型标识本身不符合语法,就会触发错误。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

