C++ 标准委员会有机会使用 string_view 使代码更安全,但他们选择添加从 basic_string 到 basic_string_view 的隐式转换。
如此有效,他们这么说
// No worries, everyone always reads the docs...
struct Foo{
string_view sv;
//I really want to make this constexpr
constexpr Foo(string_view sv):sv(sv){}
};
/* ...some Friday afternoon... */
string s{"Looks like it works"};
Foo f{s + "..."};
不如这个重要
string f{"foo"};
string_view b{"bar"};
i_wonder(f == b);
//glad I didn't have to type static_cast<string_view>(f)!!
请告诉我,从 basic_string 到 basic_string_view 的隐式转换有更好的理由。
最糟糕的部分是你需要 string_view 来利用 constexpr (我知道,或者 char*...)
更新:这个问题已被搁置,因为它不符合 SO 的指导方针。很公平。我认为这是需要强调的一点。我认为这是隐式转换是一种倒退。我开始看到人们(甚至是非常有经验的人)写悬空指针,因为这就像 90 年代一样。
专门使用 string_view 的最佳实践是 WRT 从所有者隐式转换为非所有者的风险?永恒的警惕不是答案。
我不得不说我很惊讶这里很少有人关心类型安全。这是“现代” C++ 的重复目标。