C++ 为什么Clang将显式强制转换解释为隐式强制转换?

C++ 为什么Clang将显式强制转换解释为隐式强制转换?,c++,c,casting,clang,C++,C,Casting,Clang,我最近一直在使用Clang,当解析显式转换时,总会出现这种小小的好奇 为了明确我的观点,以下是一些基本代码: int main(){ int my_int; float my_float; my_int = (int) my_float; return 0; } 当然你会期望my_int=(int)my_float被解析为a,a的值为CK_floatingpointegral,但事实并非如此,事实上,强制转换的性质存储在中,而CStyleCastEx

我最近一直在使用
Clang
,当解析显式转换时,总会出现这种小小的好奇

为了明确我的观点,以下是一些基本代码:

int main(){
    int my_int; 
    float my_float; 

    my_int = (int) my_float; 
    return 0; 
} 
当然你会期望
my_int=(int)my_float
被解析为a,a的值为
CK_floatingpointegral
,但事实并非如此,事实上,强制转换的性质存储在中,而
CStyleCastExpr
保存着
NoOp
性质

以下是此代码的匹配AST转储:

|-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

您对此有什么解释吗?

这似乎是clang实施的副作用:

生成强制转换节点的源代码文件是:


静态强制转换(我的浮动)怎么样?我的强制转换没有任何问题,它们很好。但就我个人而言,我对答案很好奇。这是一个令人误解的概念吗?我的评论是,
(int)My_float
是否不是语言的隐式转换,而显式转换则更接近于
静态转换()
常量转换()
等。我不是一个标准专家。你在
C
C++
中都有这种体验吗?不,这只对C++有效
int main(){
    int my_int;
    float my_float; 

    // implicit cast from float to int
    my_int = my_float;
    return 0; 
}