我想将
std::uint16_t
转换为 std::string_view
。我期望以下代码能够工作:
std::string_view to_str(std::uint16_t v) {
return std::string_view(std::to_string(v));
}
因为它在
std::string
函数作用域中使用了中介 to_str
。
我知道我可以使用静态存储来存储中间字符串,如下所示:
std::string_view to_str(std::uint16_t v) {
static auto str = std::to_string(v);
return std::string_view(str);
}
我知道还有另一种方法可以使用
char buffer
并将其转换为 string_view
但我想知道是否有更好的方法来达到同样的目的?返回 string_view
而不是 string
是否符合逻辑?
std::string_view
是一个轻量级类,不拥有数据。它只是对另一个对象(例如 std::string
)所保存的数据的视图。
在这一行中:
return std::string_view(std::to_string(v));
您返回一个
string_view
,引用从 std::string
返回的临时
std::to_string
。然后该临时对象将被销毁,因此您返回的 string_view
无效(类似于悬空指针/引用)。访问它会调用 未定义行为。
当您使用
static auto str = std::to_string(v);
时,它似乎可以解决这个问题,因为静态 str
在函数返回后将保持活动状态。但实际上这并不是一个好的解决方案。 str
只会初始化一次,因此下次使用不同的 to_str
值调用 v
时,第一次调用仍将返回 string_view
。
解决方案是简单地返回
std::string
而不是 std::string_view
。您仍然可以将其传递给需要 std::string_view
的方法。