所以我有一個回傳小寫字串的函式
constexpr auto string_to_lower_case(const std::string& string) {
return string
| std::views::transform(std::tolower)
| std::views::transform([](const auto& ascii) { return static_cast<char>(ascii); });
}
"SOME"當我通過or時,我希望該函式回傳相同的結果const std::string some("SOME"),但事實并非如此。當我嘗試列印結果時string_to_lower_case("SOME"),我檢索到一個空控制臺(的輸出string_to_lower_case(some)是正確的)
const std::string some("SOME");
for (const auto& ch : string_to_lower_case(some))
std::cout << ch;
uj5u.com熱心網友回復:
一些問題:
std::string當您使用 a 呼叫函式時創建的臨時函式char[]在函式回傳時超出范圍,然后被銷毀。之后您回傳的view不能用于迭代字串。- 您使用
std::tolower不允許的地址,因為它不在指定可尋址函式串列中。 - 您不會將
char使用的 with轉換std::tolower為unsigned charfirst。如果char有一個負值,它會導致未定義的行為。 - 你的第二次
transform似乎是多余的。
另一種方法是回傳實際std::string而不是view:
constexpr std::string string_to_lower_case(const std::string& string) {
auto view = string
| std::views::transform([](char ch){
return static_cast<char>(std::tolower(static_cast<unsigned char>(ch)));
});
return {view.begin(), view.end()};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492600.html
