-4

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

4

1 回答 1

3

basic_string请告诉我,从to隐式转换有更好的理由basic_string_view

好吧,我们想要:

  1. 能够编写在string_views 而不是strings 上工作的函数,以免限制调用者关于字符串数据的存储方式/谁拥有它 - 并且不必为strings、char *'s 等编写这些函数的变体。
  2. 能够轻松地将strings 传递给这些函数

所以我们需要隐式转换。

于 2018-05-22T00:39:09.337 回答