std::string = int;
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 12.02.14 05:20
Оценка:
Привет.

Наступил на баг который при этом пропустил компилятор

Если записать так
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;
   }                    
};


Это баг или у меня какой-то галки не стоит в студии?
Re: std::string = int;
От: Jack128  
Дата: 12.02.14 05:43
Оценка: 4 (1) +1
Здравствуйте, PPA, Вы писали:

PPA>Это баг или у меня какой-то галки не стоит в студии?

Лямбда тут не причем.
тут fffff = 1213;
1213 <= 255(или 128, хз как там char в студии выглядит), поэтому к char'у это число невозможно привести без потери данных. на это тебе компилятор и ругается.

а тут p_value = 123;
123 <= 255, никакого обрезания данных нет, поэтому и варнинга нет.
Re[2]: std::string = int;
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 12.02.14 06:48
Оценка:
Здравствуйте, 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());


а тут компилер молчит почему-то.
Re[3]: std::string = int;
От: Jack128  
Дата: 12.02.14 07:36
Оценка:
Здравствуйте, 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 );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.