为什么 std::string_view 不是微不足道的?
why std::string_view is not trivial?
我想 "migrate" 到 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)
;
}
returns 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 吗?
您对 string_view
的特定实现可能是简单可复制的标准布局。但标准并不 要求 所有 string_view
实现。因此,您所做的只是测试您的特定标准库版本是否具有这些属性。
有效的 string_view
实现根本不能是普通类型。该标准要求默认构造的 string_view
为空,这要求其默认构造函数是非平凡的。
我想 "migrate" 到 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)
;
}
returns 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 吗?
您对 string_view
的特定实现可能是简单可复制的标准布局。但标准并不 要求 所有 string_view
实现。因此,您所做的只是测试您的特定标准库版本是否具有这些属性。
有效的 string_view
实现根本不能是普通类型。该标准要求默认构造的 string_view
为空,这要求其默认构造函数是非平凡的。