C++编译时的类型推导

来源:互联网 发布:get it beauty2015 编辑:程序博客网 时间:2024/06/09 18:45

首先明确一点,VisualStudio实现的C++的类型推导是在编译时进行的。

如下代码:

#include <iostream>using namespace std;int main() {  int a = 10000;char c = 'a';cout << ((2 > 1) ? a : c)  << endl;cout << ((2 > 3) ? a : c)  << endl;return 0;}
下面是VS2010的输出:



如果在运行时可以自动推断的话,那么第二行的输出就应该是'a'。所以得出结论,VisualStudio的C++的实现中,类型推导是在编译时进行的。


问题来了,今天忽然发现,可能在编译期间存在两套推导系统。

代码如下:

#include <iostream>using namespace std;int main() {  char c = 'a';c = c + 256;c = c + 255;cout << c + 1 << endl;return 0;}
将警告等级调制LV4,会报警告“warning C4244: “=”: 从“int”转换到“char”,可能丢失数据”。

但令人奇怪的是,警告的行是c = c + 256的那行,而下一行c = c + 255并没有报警告(对两行赋值语句单独测试时一样如此)。

说明类型推导时,将(c+256)视作int型变量,而将(c+255)视作char型变量。

但在cout时,却将(c+1)视作整型变量来输出。令人费解。


所以,这里有疑问,到底在类型推导时,将(c+255)这个表达式视作何种类型了呢?

0 0