std :: string_view可以复制吗?

时间:2018-09-01 17:38:56

标签: c++ language-lawyer c++17

对于某些类型,该标准明确声明它们是可复制的。例如,std::chrono::day就是这种类型。

但是,对于std::string_view,没有这样的声明。但是,它似乎满足了普通复制的要求(或者我忽略了某些东西?)。

问题是,我可以指望std::string_view可以被复制吗?

1 个答案:

答案 0 :(得分:6)

我认为这是强烈暗示的。

[string.view.template]将类模板声明为(我省略了与该问题不完全相关的所有内容):

template<class charT, class traits = char_traits<charT>>
class basic_string_view {
public:
  // types
  using const_pointer          = const value_type*;
  using size_type              = size_t;
private:
  const_pointer data_; // exposition only
  size_type size_;     // exposition only
};

[objects.within.classes]说:

  

为了便于说明,某些条款为满足类的外部规范的类的私有成员提供了代表性的声明和语义要求。对于此类成员的声明,后跟一个仅以博览会结尾的注释,例如:

streambuf* sb;  // exposition only
     

实现可以使用任何提供等效可观察行为的技术。

std::string_view是否完全包含两个类型为char const*size_t的成员是不确定的-但是该类必须具有与此类实现的行为等效的可观察行为。这样的实现将是可复制的。

此外,许多成员函数都被声明为constexpr,它本身在C ++ 17中需要微不足道的破坏(否则,该注释将是格式错误的NDR)。