首先明确一点,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)这个表达式视作何种类型了呢?