почему std :: string_view не тривиален? - PullRequest
0 голосов
/ 06 октября 2019

Я хочу "перейти" на C ++ 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

иЯ не вижу никакого d-tor.

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

1 Ответ

2 голосов
/ 06 октября 2019

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

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

...