为什么Clang将显式强制转换解释为隐式强制转换?
Why does Clang interprets an explicit cast as an implicit cast ?
我最近一直在研究Clang
,当解析显式强制转换时,总是会出现这种小好奇。
int main(){
int my_int;
float my_float;
my_int = (int) my_float;
return 0;
}
当然,您会期望my_int = (int) my_float;
被解析为CStyleCastExpr, CastKind为CK_FloatingToIntegral
,但事实并非如此,而且,事实上,转换的性质存储在ImplicitCastExpr中,而CStyleCastExpr
持有NoOp
性质。
下面是这段代码的匹配AST-dump:
|-DeclStmt 0x2eb3528 <line:3:1, col:11>
| `-VarDecl 0x2eb34d0 <col:1, col:5> my_int 'int'
|-DeclStmt 0x2eb35a8 <line:4:1, col:15>
| `-VarDecl 0x2eb3550 <col:1, col:7> my_float 'float'
|-BinaryOperator 0x2eb3678 <line:5:1, col:16> 'int' lvalue '='
| |-DeclRefExpr 0x2eb35c0 <col:1> 'int' lvalue Var 0x2eb34d0 'my_int' 'int'
| `-CStyleCastExpr 0x2eb3650 <col:10, col:16> 'int' <NoOp>
| `-ImplicitCastExpr 0x2eb3638 <col:16> 'int' <FloatingToIntegral>
| `-ImplicitCastExpr 0x2eb3620 <col:16> 'float' <LValueToRValue>
| `-DeclRefExpr 0x2eb35e8 <col:16> 'float' lvalue Var 0x2eb3550 'my_float' 'float'
`-ReturnStmt 0x2eb36c0 <line:6:1, col:8>
`-IntegerLiteral 0x2eb36a0 <col:8> 'int' 0
这似乎有点令人困惑,因为ImplicitCastExpr
应该只有在发生意外强制转换时才会被识别(参见下面的代码)。
int main(){
int my_int;
float my_float;
// implicit cast from float to int
my_int = my_float;
return 0;
}
你能解释一下吗?
这似乎是clang实现的副作用:
http://comments.gmane.org/gmane.comp.compilers.clang.devel/17369生成转换节点的源代码文件为:
https://github.com/llvm-mirror/clang/blob/master/lib/Sema/SemaCast.cpp相关文章:
- 隐式重新解释引用时强制转换,没有警告/错误
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 使用重新解释强制转换时交换字节序
- 通过指针访问数据(重新解释转换)与 .或 ->运算符
- 转换构造函数:您如何解释C 中给定不同参数的函数
- 在没有额外成员的情况下重新解释转换为派生类可以吗
- 是从指针的矢量到常量指针的矢量的重新解释强制转换的安全性
- 转换基元时的内存解释
- 用c++中的重新解释强制转换扩展嵌套宏
- 通过重新解释强制转换创建无效引用
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- 重新解释转换 IDXGISwapChain** 指向 IUKnown** 指针的指针
- 请解释我在将字符串转换为字符时需要附加'