Привет.
Наступил на баг который при этом пропустил компилятор
Если записать так
std::string fffff;
fffff = 1213;
то VC++2010 ругается
* warning C4305: 'argument' : truncation from 'int' to 'char'
* warning C4309: 'argument' : truncation of constant value
А если аналогичное присвоение делается в лямде, то компилятор молчит
auto initString = [&](const string& p_name, string& p_value) -> void
{
const string l_value = l_xml.getChildAttrib(p_name);
if(!l_value.empty())
{
p_value = 123;
}
};
Это баг или у меня какой-то галки не стоит в студии?
Здравствуйте, Jack128, Вы писали:
PPA>>Это баг или у меня какой-то галки не стоит в студии?
J>Лямбда тут не причем.
J>тут fffff = 1213;
J>1213 <= 255(или 128, хз как там char в студии выглядит), поэтому к char'у это число невозможно привести без потери данных. на это тебе компилятор и ругается.
J>а тут p_value = 123;
J>123 <= 255, никакого обрезания данных нет, поэтому и варнинга нет.
Спасибо. точно, компилер в момент компиляции определяет размер константы.
но у меня был рантайм. (константу 123 я тут для примера вбабахал)
Вот такой глючный код из-за которого вместо того чтобы загрузить из XML строку я загружал хрень.
p_value = atoi(l_value.c_str());
а тут компилер молчит почему-то.
Здравствуйте, PPA, Вы писали:
PPA>Спасибо. точно, компилер в момент компиляции определяет размер константы.
PPA>но у меня был рантайм. (константу 123 я тут для примера вбабахал)
PPA>Вот такой глючный код из-за которого вместо того чтобы загрузить из XML строку я загружал хрень.
PPA>PPA>p_value = atoi(l_value.c_str());
PPA>
PPA>а тут компилер молчит почему-то.
ну так компилятор же не знаю, что вернет atoi, может там будет допустимое значение.
Вообще теоретически для недопущения таких вещей в с++11 ввели синтаксис с фигурными скобками.
char ch = 10;
int i = 10;
i = ch; // компилируется
ch = i; // компилируется
i = { ch }; // компилируется
ch = { i }; // не компилируется, так как возможен narrowing
но конкретно в случае присваивания "str_var = { char_var }" что там не работает.
скорее всего потому что компилятор не может выбрать между
basic_string& operator=( CharT ch );
basic_string& operator=( std::initializer_list<CharT> ilist );