函数参数为std::string_view返回std::string时编译错误的解决方法
问题解决:std::string_view转std::string的编译错误
错误原因
你遇到的编译错误核心是:std::string_view与std::string之间不存在隐式类型转换。你的myFunc返回类型是std::string,但直接返回的string_view.substr()结果(仍是std::string_view)或stringView本身,编译器无法自动完成类型转换,因此报错。
解决方法
显式调用std::string的构造函数即可,std::string从C++17开始支持用std::string_view直接初始化,你考虑的用std::string_view初始化本地std::string完全可行,和直接构造返回逻辑一致。
修正后的代码如下:
std::string myFunc(std::string_view stringView) { // 注意:原代码的转义符号需修正为C++合法写法,单个反斜杠要双转义 size_t i = stringView.find_last_of("/\\"); // 建议使用string_view的npos,类型更匹配,和string::npos功能等价 if (i != std::string_view::npos) // 显式构造std::string返回 return std::string(stringView.substr(i + 1)); // 同样显式构造 return std::string(stringView); } int main() { std::string testString{"TestString"}; std::string_view testView{testString}; // 这里的初始化是合法的,std::string支持用string_view构造 std::string test{testView}; return 0; }
额外说明
- 原代码中
find_last_of的参数"/\"是HTML转义后的写法,实际C++代码中要写成"/\\"才能正确表示包含正斜杠和反斜杠的字符集。 - 判断位置时,
std::string_view::npos比std::string::npos更贴合当前变量类型,不过两者本质都是size_t类型的最大值,功能上可以通用。
内容的提问来源于stack exchange,提问作者n_90040
相关产品推荐
相关产品推荐

