Различная обработка знакового значения между MSVC и GCCC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Различная обработка знакового значения между MSVC и GCC

Сообщение Anonymous »

Возьмите приведенный ниже фрагмент кода, который просто обрезает строку, удаляя пробелы с обоих концов:

Код: Выделить всё

const std::string TrimString(const std::string& s)
{
const auto iter = std::find_if(s.cbegin(), s.cend(), [](auto c) -> bool { return !std::isspace(static_cast(c)); });
return iter != s.end() ? std::string(iter, std::find_if(s.crbegin(), s.crend(), [](auto c) -> bool { return !std::isspace(static_cast(c)); }).base()) : std::string();
}

//Usage
std::vector d{ 0xc5, 0xbc };     // example UTF-8 character
std::string uft8(d.begin(), d.end());

std::string trimmed = TrimString(utf);
Приведенный выше код, если вы запустите его на MSVC (17.14.19), на самом деле приведет к сбою, но в Linux с использованием GCC (14.2.0) он будет работать отлично.
Теперь я знаю, ПОЧЕМУ он дает сбой, и это достаточно легко исправить, но я пытаюсь понять эту разницу и даже то, что говорит об этом стандарт.
Причина сбоя заключается в том, что MSVC, std::isspace принимает целое число, которое должно находиться в диапазоне -1 -> 255 (согласно диалоговому окну сбоя во время выполнения). Но тогда почему это работает в GCC?
Очевидно, это связано с auto как параметром лямбды. В MSVC автоматическим параметром лямбды, вероятно, является int32_t, поэтому каждый байт расширяется по знаку, и это приводит к сбою. В чем я не уверен, так это в том, что происходит в случае с GCC. Наверняка, это тоже будет делать что-то подобное? Является ли std::isspace менее разборчивым в Linux?
Кто-нибудь знает, что говорит стандарт о том, какой тип auto будет в приведенном выше примере? Я думал, что это будет тот же тип ввода, который будет char? Или это будет int32_t, тогда почему бы ему не получить расширенный знак и не произойти сбой в Linux?
Это легко исправить, но мне нужно больше понять разницу между MSVC и GCC в этом отношении.

Подробнее здесь: https://stackoverflow.com/questions/798 ... vc-and-gcc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»