unicode char与非unicode char比较,但没有警告也没有错误

时间:2008-12-31 16:18:44

标签: c++ string unicode

为什么下面的代码没有给出错误,也没有关于隐式转换的任何类型的警告?

std::wstring str = L"hi";
if(str[0] == 'h')
      cout<<"strange"<<endl;

正确的正常代码是:

std::wstring str = L"hi";
if(str[0] == L'h')
      cout<<"strange"<<endl;

编译器:visual studio 2005

警告级别:级别4(最高)

3 个答案:

答案 0 :(得分:7)

由于比较有效,因此不会发出警告。一般来说,您总是可以比较整数类型,只需根据需要升级到更广泛的类型。

我很确定一些编译器会发出警告。你在用哪一个? (在任何情况下,警告都是特定于编译器的,并且他们不需要警告这个或其他任何事情)

答案 1 :(得分:2)

  

为什么以下代码不会出错?

不是因为C ++允许隐式转换吗?例如,以下内容也不合法:

if (str[0] == 104) //C++ allows various implicit type conversions
  

...也没有关于隐式转换的任何类型的警告?

该问题是特定于编译器的:您使用的编译器是什么?可能有一个编译器选项会影响从编译器获得的警告类型。

答案 2 :(得分:0)

很难确定为什么编译器不会发出警告。他们可能出于任何原因这样做,并且在代码可疑时应该这样做。但是,错误是错误的,因为代码在技术上是正确的。

在这种情况下,我的假设是编译器不会发出警告,因为编译器使用Unicode wchar_t和ISO-8859-1 char。 Unicode子集U + 0000到U + 00FF等于ISO 8859-1字符0-FF。因此,每个char具有与其对应的wchar_t相同的数值。因此,wchar_t('a')==L'a'