std :: istringstream: трудности с обработкой ошибок при чтении отрицательных значений в неподписанные переменные [duplicate]

Вы должны указывать вызов по ссылке в определении функции, а не на фактический вызов. Поскольку PHP начал показывать ошибки устаревания в версии 5.3, я бы сказал, что было бы неплохо переписать код.

Из документации :

В вызове функции нет ссылочного знака - только для определения функций. Определений функций достаточно, чтобы правильно передать аргумент по ссылке. Начиная с PHP 5.3.0 вы получите предупреждение о том, что «call-by-reference-ссылка» устарела, когда вы используете & в foo(&$a);.

blockquote>

Например , вместо использования:

// Wrong way!
myFunc(&$arg);               # Deprecated pass-by-reference argument
function myFunc($arg) { }

Использование:

// Right way!
myFunc($var);                # pass-by-value argument
function myFunc(&$arg) { }

9
задан Baum mit Augen 3 April 2018 в 14:21
поделиться

3 ответа

Консалтинг C ++ 03, 22.2.2.1.2 / 11, форматы наследуются от scanf и друзей, которые, в свою очередь, все говорят, что преобразованная последовательность символов «необязательно подписана», даже для тех, у которых нет знака вывод. strtoul то же самое.

Итак, предположим, вы могли бы сказать, что стандарт, который задает поведение, является C89 для C ++ 03, C99 для C ++ 11.

Поскольку - оказывается допустимым только как первый символ, я предполагаю, что обходной путь - проверить его с помощью peek перед использованием operator>>.

6
ответ дан Steve Jessop 16 August 2018 в 03:27
поделиться

Если я правильно прочитал 22.2.2.1.2 / таблицу 5, это показывает, что извлечение в unsigned эквивалентно scanf с %u, которое появляется также , делает отрицательное -> положительное преобразование .

0
ответ дан Mark B 16 August 2018 в 03:27
поделиться

Разве это было бы совсем иначе, если бы вы это сделали?

int i;
unsigned int u;
c >> i;
u = i;
std :: cout << u;

Не имеет большого значения, что operator>> допускает несоответствие знака, поскольку базовые правила C позволят сделать молчащее преобразование в любом случае.

Это говорит о том, что my gcc (4.3.5 на Solaris) говорит, что это ошибка преобразования.

g3]

-1
ответ дан spraff 16 August 2018 в 03:27
поделиться
  • 1
    Было бы совсем иначе при компиляции с -Wconversion -Wsign-conversion -Werror. Я могу отключить бесшумные преобразования, но не нарушить обработку значков iostream. – thiton 6 October 2011 в 17:11
  • 2
    Вероятно, он решил обработать его так же, как обрабатываются литералы, но я не знаю, что говорит об этом стандарт. – Mark B 6 October 2011 в 17:15
  • 3
    Ошибка преобразования - это хорошо, и похоже, потому что вы используете старую версию gcc (pre 4.4.1, в соответствии с ошибкой), что оставляет мне все еще интересно, почему люди gcc пытались что-то исправить. – thiton 6 October 2011 в 17:15
Другие вопросы по тегам:

Похожие вопросы: