Является ли std :: string_view тривиально копируемым? - PullRequest
0 голосов
/ 01 сентября 2018

Для некоторых типов стандарт прямо заявляет, что они могут быть легко скопированы. Например, std::chrono::day такой тип.

Но для std::string_view такого утверждения нет. Тем не менее, кажется, что он отвечает требованиям тривиального копирования (или, может быть, я что-то упустил?).

Вопрос в том, могу ли я рассчитывать на то, что std::string_view легко копируется?

1 Ответ

0 голосов
/ 01 сентября 2018

Я считаю, что это сильно подразумевается.

[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 требовало тривиального уничтожения (в противном случае эта аннотация была бы неправильно сформированным отчетом о недоставке).

...