Здравствуйте, Константин Л., Вы писали:
КЛ>Вот это компилицца без единого ворнинга:
КЛ>
КЛ>std::string s = "blablabla";
КЛ>std::string s1 = s + + "<";
КЛ>
Прикольно
Дошло не сразу, но все же дошло:
string s1 = s + (+ "<");
5.3.1/5
The operand of the unary + operator shall have arithmetic, enumeration, or pointer type and the result is the
value of the argument. Integral promotion is performed on integral or enumeration operands. The type of
the result is the type of the promoted operand.
Здравствуйте, Константин Л., Вы писали:
КЛ>Вот на это выдается ворнинг:
КЛ>
КЛ>char* s = "";
КЛ>+s;
КЛ>
КЛ>Логично было бы выдавать ворнинг и в первом варианте. Собсно, из-за отсутствия ворнинга я пропустил баг, тк между плюсами должно было кое-что стоять.
Во втором варианте warning о другом: о том что expression исполюзуется как statement with no effects. А в первом варианте expression использовался не как statement, а как часть expression'а.
Другими словами, не в «унарности» плюса дело, такой же warning C4552 выдавался бы и на бинарный плюс:
5.3.1/5
The operand of the unary + operator shall have arithmetic, enumeration, or pointer type and the result is the value of the argument. Integral promotion is performed on integral or enumeration operands. The type of the result is the type of the promoted operand.
Здравствуйте, Константин Л., Вы писали:
КЛ>Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего.
Вот он, здравый смысл
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, Константин Л., Вы писали:
КЛ>>Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего. V>Вот он, здравый смысл
а по-твоему с этим кодом все нормально? К чему улыбки то?
Re: [BUG] VS8 и оператор +
От:
Аноним
Дата:
31.01.08 15:16
Оценка:
Здравствуйте, Константин Л., Вы писали:
КЛ>Вот это компилицца без единого ворнинга:
КЛ>
КЛ>std::string s = "blablabla";
КЛ>std::string s1 = s + + "<";
КЛ>
Comeau C/C++ 4.3.9 — Compile succeeded
VS 9 :
error C2784: 'std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>)' : could not deduce template argument for 'std::_String_iterator<_Elem,_Traits,_Alloc>' from 'const char [2]'
E:\Program Files\Microsoft Visual Studio 9.0\VC\include\xstring(440) : see declaration of 'std::operator +'
B>Тоже не самое явное/ожидаемое на свете поведение...
А мне такой хак понравился :) А то вот, скажем, выводишь ты число в поток, имея в виду, что оно целое:
std::cout << n << std::endl;
А потом оказывается, что оно у тебя типа boost::uint8_t, который на самом деле unsigned char, поэтому в поток нарисуется не число, а символ ASCII. А быть может, это шаблонная функция, там заранее не знаешь, что выведется, и неожиданное поведение проявится при редком инстанцировании с этим самым char, который народу заменяет fixed size int type размером в 1 байт.
Поэтому приходится не забывать писать уродство вроде такого:
std::cout << unsigned(n) << std::endl;
Вот, а раз оказывается, что унарный плюс делает integral promotion, то можно писать просто
std::cout << +n << std::endl;
Или есть какие-то свои подводные грабли?
B>Короче запретить надо унарный плюс, а то нет от него никаких доходов — расходы одни (с) :)
В целом согласен, неплохо бы и запретить. Но не верно, что совсем никаких доходов :)
Здравствуйте, Qbit86, Вы писали:
Q>А мне такой хак понравился А то вот, скажем, выводишь ты число в поток, имея в виду, что оно целое: Q>
Q>std::cout << n << std::endl;
Q>
Q>А потом оказывается, что оно у тебя типа boost::uint8_t, который на самом деле unsigned char, поэтому в поток нарисуется не число, а символ ASCII. А быть может, это шаблонная функция, там заранее не знаешь, что выведется, и неожиданное поведение проявится при редком инстанцировании с этим самым char, который народу заменяет fixed size int type размером в 1 байт.
Q>Поэтому приходится не забывать писать уродство вроде такого: Q>
Q>std::cout << unsigned(n) << std::endl;
Q>
ИМХО лучше уж понятное уродство...
Кстати вот еще.
Q>В целом согласен, неплохо бы и запретить. Но не верно, что совсем никаких доходов
Ну, из песни ведь слова не выкинешь
Здравствуйте, Константин Л., Вы писали:
КЛ>>>Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего. V>>Вот он, здравый смысл КЛ>а по-твоему с этим кодом все нормально?
Ты не понял, я с тобой согласен. КЛ>К чему улыбки то?
Просто наблюдаю в последнее время необоснованную и всемирную "правату" стандарта.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Bell, Вы писали:
B>ИМХО лучше уж понятное уродство...
Да, согласен. Принцип наименьшей неожиданности. Краткость записи с унарным плюсом не оправдывает удивления того, кто читает код. Он такого хака не оценит, и будет прав.
Q>Вот, а раз оказывается, что унарный плюс делает integral promotion, то можно писать просто Q>
Q>std::cout << +n << std::endl;
Q>
Q>Или есть какие-то свои подводные грабли?
Собственно говоря, граблями тебя стукнет читатель этого кода.
B>>Короче запретить надо унарный плюс, а то нет от него никаких доходов — расходы одни (с) Q>В целом согласен, неплохо бы и запретить. Но не верно, что совсем никаких доходов
Его можно перегузить
этим пользуются всякие spirit'ы и xpressive'ы
Здравствуйте, Bell, Вы писали:
Q>>А мне такой хак понравился :) А то вот, скажем, выводишь ты число в поток, имея в виду, что оно целое: Q>>
Q>>std::cout << n << std::endl;
Q>>
Q>>А потом оказывается, что оно у тебя типа boost::uint8_t, который на самом деле unsigned char, поэтому в поток нарисуется не число, а символ ASCII. А быть может, это шаблонная функция, там заранее не знаешь, что выведется, и неожиданное поведение проявится при редком инстанцировании с этим самым char, который народу заменяет fixed size int type размером в 1 байт.
Q>>Поэтому приходится не забывать писать уродство вроде такого: Q>>
Q>>std::cout << unsigned(n) << std::endl;
Q>>
B>ИМХО лучше уж понятное уродство... B>Кстати вот еще.
Ага, я именно оттуда об этом и узнал.
А вообще, лучше сделать функцию вроде такой:
template <class Integral>
boost::mpl::if_c<boost::integer_traits<Integral>::is_signed, int, unsigned> promote(Integral x) // TODO: long long
{
return x;
}
Здравствуйте, Константин Л., Вы писали:
КЛ>Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего.
А минус ему за что? Я тоже считаю, что унарный плюс перед указателем — ошибкоопасная странность.