basic_string到basic_string_view隐式转换......呃为什么?

时间:2018-05-22 00:17:48

标签: c++ string c++17 implicit-conversion string-view

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 ++的重复目标。

1 个答案:

答案 0 :(得分:3)

  

请告诉我,从basic_stringbasic_string_view的隐式转换有更好的理由。

好吧,我们想:

  1. 能够编写在string_view而不是string上工作的函数,以便不限制调用者关于如何存储字符串数据/拥有它的人 - 并且不必编写变体这些功能适用于string s,char *
  2. 能够轻松将string传递给这些功能
  3. 所以我们需要隐式转换。