C++如何判定需要将字符串字面量转换为std::string_view?
底层实现逻辑说明
这个行为是C++标准明确规定的合法行为,并非编译器自定义扩展,核心基于两个规则:
1. std::string_view支持C风格字符串的隐式构造
std::string_view提供了公开的非显式构造函数constexpr basic_string_view(const CharT* s),字符串字面量"abc"的原生类型是const char[4],在传参时会自动 decay 为const char*,完全匹配该构造函数的入参要求,不需要显式标注就能完成从C风格字符串到std::string_view的隐式转换。
2. std::optional的泛型转发构造函数规则
C++17及更高版本标准中,std::optional<T>定义了非显式的泛型构造函数:
template< class U = T > constexpr optional( U&& value );
该构造函数仅在满足以下条件时参与重载决议:
std::is_constructible_v<T, U>结果为真,即T类型可以使用U类型的入参完成构造- U类型既不是
std::optional的同类型/派生类型,也不是std::in_place_t类型
你的代码中传入std::optional<std::string_view>构造函数的入参是"abc",完全满足std::string_view可从该类型构造的要求,因此该泛型构造函数会被重载决议选中,在构造optional内部存储的std::string_view对象时,自动调用std::string_view(const char*)完成隐式转换,不需要手动编写显式构造代码。
补充:如果目标类型T的对应构造函数被
explicit修饰,或者传入的参数无法隐式转换为T,就必须手动编写显式构造逻辑。
内容的提问来源于stack exchange,提问作者user2674487
相关产品推荐
相关产品推荐

