Как я могу сказать gcc предупредить меня о том, что строкам присваивается целое значение? - PullRequest
2 голосов
/ 27 октября 2011

Это мой тестовый пример (обратите внимание на комментарий WTF):

TEST(string_assignment)
{
std::string str;
std::string cheese="Cheese";
str=cheese;
CHECK_EQUAL(cheese, str);

long lval=0;
str=lval; //WTF - why does the compiler allow this ?

str="";
str.append(cheese);
CHECK_EQUAL(cheese, str);
}

Я хочу поймать случаи, когда std :: string назначается что-то отличное от другой строки или символа *Я предполагал, что компилятор отклонит несовместимый тип, но он разрешает его.

Как я могу сказать gcc (версия 4.4.3) отклонить эту глупость?... или есть какой-то другой способ принудительного отклонения этих несовместимых типов, назначаемых std :: string?

Ответы [ 3 ]

5 голосов
/ 27 октября 2011

Причина в том, что существует следующая перегрузка:

string &operator=(char)

Компилятор может удовлетворить ваше назначение одним неявным преобразованием, поэтому он компилируется.

Я думаю, что флаг -Wconversion GCC должен справиться с этим, но, похоже, он не работает, по крайней мере, в GCC 4.1.2.

3 голосов
/ 27 октября 2011

Компилируется из-за следующей перегрузки:

string& operator=(char)

Используйте g++ -Wconversion для печати предупреждающих сообщений.

И g++ -Wconversion -Werror для обработки предупреждения как ошибки.

3 голосов
/ 27 октября 2011

Потому что не может. В конечном счете, из-за совместимости с C: long, как и все другие встроенные числовые типы, неявно преобразуется в char. Таким образом, чтобы запретить это, вы также должны запретить someString = someChar. Что не слишком меня беспокоит, но по каким-то причинам комитет счел необходимым.

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