символ unicode, сравниваемый с символом не Unicode, но без предупреждения и ошибки - PullRequest
1 голос
/ 31 декабря 2008

Почему следующий код НЕ выдает ошибку или предупреждение о неявном преобразовании?

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 ]

7 голосов
/ 31 декабря 2008

Не выдает предупреждение, потому что сравнение допустимо. В общем, вы всегда можете сравнить целочисленные типы, они просто переводятся в более широкие типы по мере необходимости.

И я уверен, что некоторые компиляторы выдадут предупреждение об этом. Какой вы используете? (В любом случае, предупреждения зависят от компилятора, и они не обязаны предупреждать об этом или о чем-либо еще)

2 голосов
/ 31 декабря 2008

Почему следующий код НЕ выдает ошибку ...

Не потому ли, что C ++ допускает неявные преобразования? Например, не законно ли следующее:

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

... ни какой тип предупреждения о неявном преобразовании?

Этот вопрос зависит от компилятора: какой компилятор вы используете? Вероятно, есть опция компилятора, которая влияет на то, какие типы предупреждений вы получаете от компилятора.

0 голосов
/ 02 января 2009

Трудно сказать наверняка, почему компилятор не выдает предупреждение. Они могут сделать это по любой причине, и должны делать это, когда код сомнителен. Однако ошибка будет неуместна, поскольку код технически верен.

В этом случае я предполагаю, что компилятор не выдает предупреждение, потому что компилятор использует Unicode wchar_t и символ ISO-8859-1. Подмножество Unicode от U + 0000 до U + 00FF соответствует ISO 8859-1 символа 0-FF. Таким образом, каждый символ имеет то же числовое значение, что и соответствующий ему wchar_t. В результате wchar_t('a')==L'a'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...