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