Код: Выделить всё
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, 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
Мобильная версия