std::string_view转std::string的编译差异原因及正确调用方法
编译结果差异的核心原因
std::string接收std::string_view参数的构造函数是被explicit关键字修饰的,C++标准对explicit构造函数的使用规则有明确限制:
- 仅允许在显式直接初始化场景下调用
- 禁止在隐式类型转换场景下自动调用
第一段代码中,构造函数初始化列表的str{ str_view }属于显式直接初始化,符合explicit构造函数的调用规则,因此可以正常编译。
第二段代码中,调用foo(str_view)时需要把std::string_view类型隐式转换为std::string类型给形参,属于隐式类型转换场景,无法自动调用explicit修饰的转换构造函数,因此编译器会报转换失败的错误。
正确调用foo()的方案
只需要显式触发std::string的构造即可,常用写法有以下几种:
- 直接显式构造
std::string对象foo(std::string(str_view)); // 或统一初始化写法 foo(std::string{str_view}); - 用
static_cast做显式类型转换foo(static_cast<std::string>(str_view));
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

