为啥 std::string_view 不是微不足道的?

Posted

技术标签:

【中文标题】为啥 std::string_view 不是微不足道的?【英文标题】:why std::string_view is not trivial?为什么 std::string_view 不是微不足道的? 【发布时间】:2019-10-06 14:13:02 【问题描述】:

我想“迁移”到 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_viewstandard_layouttrivially_copyable,但令人惊讶的是不是 trivial

我在这里检查了一些实现:

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

我没有看到任何 d-tor。

是因为它的 c-tors 吗?

【问题讨论】:

【参考方案1】:

您对string_view 的特定实现可能是可简单复制的标准布局。但标准并不要求所有string_view 实现。因此,您所做的只是测试您的特定标准库版本是否具有这些属性。

有效的string_view 实现根本不可能是 Trivial 类型。该标准要求默认构造的string_view 为空,这要求其默认构造函数不平凡。

【讨论】:

但标准要求是 constexpt 且可轻松复制? @Nick:它是一种文字类型,是的。但它不需要是 TriviallyCopyable。

以上是关于为啥 std::string_view 不是微不足道的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 std::string_view 比 const char* 快?

为啥 C++ 标准中没有 std::string_view 类型的参数的 std::basic_string 类的构造函数[重复]

将函数参数 `const char*` 转换为 `std::string_view` 是不是安全?

std::string_view 编译时散列

删除 std::string_view 的最后一个字符

除了 std::string_view 方法之外,std::string_view 比 char* 有啥优势吗?