[BUG] VS8 и оператор +
От: Константин Л.  
Дата: 31.01.08 13:16
Оценка: 15 (2) :)
Вот это компилицца без единого ворнинга:

std::string s = "blablabla";
std::string s1 = s + + "<";
Re: [BUG] VS8 и оператор +
От: Qbit86 Кипр
Дата: 31.01.08 13:28
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Вот это компилицца без единого ворнинга:


КЛ>
КЛ>std::string s = "blablabla";
КЛ>std::string s1 = s + + "<";
КЛ>


Я не понял, в чём состоит вопрос, поэтому отвечу наугад: «Унарный плюс».
Глаза у меня добрые, но рубашка — смирительная!
Re: [BUG] VS8 и оператор +
От: Bell Россия  
Дата: 31.01.08 13:33
Оценка: 2 (2)
Здравствуйте, Константин Л., Вы писали:

КЛ>Вот это компилицца без единого ворнинга:


КЛ>
КЛ>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.

Любите книгу — источник знаний (с) М.Горький
Re[2]: [BUG] VS8 и оператор +
От: Константин Л.  
Дата: 31.01.08 13:39
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Константин Л., Вы писали:


КЛ>>Вот это компилицца без единого ворнинга:


КЛ>>
КЛ>>std::string s = "blablabla";
КЛ>>std::string s1 = s + + "<";
КЛ>>


Q>Я не понял, в чём состоит вопрос, поэтому отвечу наугад: «Унарный плюс».


Вопроса нет.

Вот на это выдается ворнинг:


char* s = "";
+s;


Логично было бы выдавать ворнинг и в первом варианте. Собсно, из-за отсутствия ворнинга я пропустил баг, тк между плюсами должно было кое-что стоять.
Re[3]: [BUG] VS8 и оператор +
От: Qbit86 Кипр
Дата: 31.01.08 13:48
Оценка: 1 (1)
Здравствуйте, Константин Л., Вы писали:

КЛ>Вот на это выдается ворнинг:


КЛ>
КЛ>char* s = "";
КЛ>+s;
КЛ>


КЛ>Логично было бы выдавать ворнинг и в первом варианте. Собсно, из-за отсутствия ворнинга я пропустил баг, тк между плюсами должно было кое-что стоять.


Во втором варианте warning о другом: о том что expression исполюзуется как statement with no effects. А в первом варианте expression использовался не как statement, а как часть expression'а.

Другими словами, не в «унарности» плюса дело, такой же warning C4552 выдавался бы и на бинарный плюс:
int i = 0;
i + 2;
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: [BUG] VS8 и оператор +
От: Константин Л.  
Дата: 31.01.08 13:59
Оценка: +2 -1
Здравствуйте, Qbit86, Вы писали:

[]

Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего.
Re[2]: [BUG] VS8 и оператор +
От: Roman Odaisky Украина  
Дата: 31.01.08 14:00
Оценка: 36 (4)
Здравствуйте, Bell, Вы писали:

B>

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 const c = '!';
std::cout << +c << std::endl;
До последнего не верил в пирамиду Лебедева.
Re[5]: [BUG] VS8 и оператор +
От: Vain Россия google.ru
Дата: 31.01.08 14:29
Оценка: +1 :)
Здравствуйте, Константин Л., Вы писали:

КЛ>Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего.

Вот он, здравый смысл
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: [BUG] VS8 и оператор +
От: Bell Россия  
Дата: 31.01.08 14:44
Оценка: +2
Здравствуйте, Roman Odaisky, Вы писали:

RO>
RO>char const c = '!';
RO>std::cout << +c << std::endl;
RO>


Тоже не самое явное/ожидаемое на свете поведение...

Короче запретить надо унарный плюс, а то нет от него никаких доходов — расходы одни (с)
Любите книгу — источник знаний (с) М.Горький
Re[6]: [BUG] VS8 и оператор +
От: Константин Л.  
Дата: 31.01.08 15:14
Оценка:
Здравствуйте, 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 +'
Re[4]: [BUG] VS8 и оператор +
От: Qbit86 Кипр
Дата: 31.01.08 15:20
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Roman Odaisky, Вы писали:


RO>>
RO>>char const c = '!';
RO>>std::cout << +c << std::endl;
RO>>


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>Короче запретить надо унарный плюс, а то нет от него никаких доходов — расходы одни (с) :)


В целом согласен, неплохо бы и запретить. Но не верно, что совсем никаких доходов :)
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: [BUG] VS8 и оператор +
От: Bell Россия  
Дата: 31.01.08 15:24
Оценка: +1
Здравствуйте, 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>В целом согласен, неплохо бы и запретить. Но не верно, что совсем никаких доходов 

Ну, из песни ведь слова не выкинешь

ЗЫ
Еще он из l-value r/value делает...
Любите книгу — источник знаний (с) М.Горький
Re[7]: [BUG] VS8 и оператор +
От: Vain Россия google.ru
Дата: 31.01.08 15:24
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>>>Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего.

V>>Вот он, здравый смысл
КЛ>а по-твоему с этим кодом все нормально?
Ты не понял, я с тобой согласен.
КЛ>К чему улыбки то?
Просто наблюдаю в последнее время необоснованную и всемирную "правату" стандарта.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: [BUG] VS8 и оператор +
От: Qbit86 Кипр
Дата: 31.01.08 16:31
Оценка: 1 (1) +1
Здравствуйте, Bell, Вы писали:

B>ИМХО лучше уж понятное уродство...


Да, согласен. Принцип наименьшей неожиданности. Краткость записи с унарным плюсом не оправдывает удивления того, кто читает код. Он такого хака не оценит, и будет прав.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: [BUG] VS8 и оператор +
От: Sergey Chadov Россия  
Дата: 31.01.08 17:07
Оценка: +1
Здравствуйте, Qbit86, Вы писали:


Q>Вот, а раз оказывается, что унарный плюс делает integral promotion, то можно писать просто

Q>
Q>std::cout << +n << std::endl;
Q>


Q>Или есть какие-то свои подводные грабли?

Собственно говоря, граблями тебя стукнет читатель этого кода.

B>>Короче запретить надо унарный плюс, а то нет от него никаких доходов — расходы одни (с)

Q>В целом согласен, неплохо бы и запретить. Но не верно, что совсем никаких доходов 
Его можно перегузить
этим пользуются всякие spirit'ы и xpressive'ы
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: [BUG] VS8 и оператор +
От: Roman Odaisky Украина  
Дата: 31.01.08 17:29
Оценка: :)
Здравствуйте, Аноним, Вы писали:

КЛ>>Вот это компилицца без единого ворнинга:


КЛ>>
КЛ>>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 +'

Ну, это из другой оперы ария.
#include <string>
До последнего не верил в пирамиду Лебедева.
Re[6]: [BUG] VS8 и оператор +
От: Roman Odaisky Украина  
Дата: 31.01.08 17:46
Оценка:
Здравствуйте, 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;
}

Хотя, пожалуй, можно и проще:
template <class Integral>
boost::mpl::if_c<(sizeof(Integral) > 1), Integral, signed short> getRidOfChar(Integral x)
{
    return x;
}
До последнего не верил в пирамиду Лебедева.
Re[5]: [BUG] VS8 и оператор +
От: Roman Odaisky Украина  
Дата: 31.01.08 17:48
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Отлично, уважаю людей за знание стандарта, но по моему скромному мнению тут должен быть ворнинг вне зависимости ни от чего.


А минус ему за что? Я тоже считаю, что унарный плюс перед указателем — ошибкоопасная странность.

Перед числовой переменной — другое дело:
test(-dx, -dy);
test(-dx, +dy);
test(+dx, -dy);
test(+dx, +dy);
До последнего не верил в пирамиду Лебедева.
Re[3]: [BUG] VS8 и оператор +
От: Аноним  
Дата: 31.01.08 19:54
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Ну, это из другой оперы ария.

RO>
#include <string>


правда ваша, искра наша
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.