почему std::string_view не тривиален?

Я хочу «перейти» на С++ 17 и изучаю его.

Я обнаружил, что это:

https://gcc.godbolt.org/z/sPnsEM

#include <string_view>
#include <type_traits>

int main(){
    return 
            (std::is_standard_layout_v<std::string_view> ? 10 : 20)
    +
            (std::is_trivial_v<std::string_view> ? 100 : 200)
    +       (std::is_trivially_copyable_v<std::string_view> ? 1000 : 2000)
    ;
}

возвращает 1210, например. std::string_view это standard_layout и trivially_copyable, но, как ни странно, это не trivial.

Я проверил некоторую реализацию здесь:

https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/experimental/string_view

и я не вижу ни одного д-тора.

Это из-за его c-tors?


person Nick    schedule 06.10.2019    source источник


Ответы (1)


Ваша конкретная реализация string_view может быть тривиально копируемой и стандартной компоновки. Но стандарт не требует этого от всех string_view реализаций. Таким образом, все, что вы делаете, это проверяете, имеет ли ваша конкретная версия стандартной библиотеки эти свойства.

Допустимая реализация string_view вообще не может быть типом Trivial. Стандарт требует, чтобы созданный по умолчанию string_view был пустым, что требует, чтобы его конструктор по умолчанию был нетривиальным.

person Nicol Bolas    schedule 06.10.2019
comment
но стандарт требует, чтобы он был контекстным и тривиально копируемым? - person Nick; 06.10.2019
comment
@Nick: Это буквальный тип, да. Но это не обязательно должно быть TriviallyCopyable. - person Nicol Bolas; 06.10.2019