Код: Выделить всё
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Очевидно, это связано с auto как параметром лямбды. В MSVC параметр auto лямбды, вероятно, является char, поэтому каждый байт расширяется по знаку, и это приводит к сбою (поскольку в конечном итоге он принимает отрицательное значение). В чем я не уверен, так это в том, что происходит в случае с GCC. Наверняка, это тоже будет делать что-то подобное?
Код: Выделить всё
std::isspaceКак я уже сказал, это легко исправить, но мне нужно больше понять разницу между MSVC и GCC в этом отношении.
Подробнее здесь: https://stackoverflow.com/questions/798 ... vc-and-gcc
Мобильная версия