将 std::uint16_t 转换为 std::string_view

问题描述 投票:0回答:1

我想将

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
是否符合逻辑?

c++ string c++17 string-view
1个回答
0
投票

问题在于

std::string_view
是一个轻量级类,不拥有数据。它只是对另一个对象(例如
std::string
)所保存的数据的视图。只要您打算使用
string_view
,您就需要保存数据的对象保持活动状态。

在这一行中:

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
(由于上面解释的原因,返回
string_view
没有意义)。
您仍然可以将其传递给需要
std::string_view
的方法。

© www.soinside.com 2019 - 2024. All rights reserved.