boost::beast::static_string memcopyable/trivial 是类型吗?

Is boost::beast::static_string memcopyable/trivial type?

我正在寻找可以在 memcopy 环境中使用并且易于构造和复制的具有固定上限大小的字符串实现。

我找到了 boost beast static_string,但我不知道我的 example 是否正常工作?

#include <algorithm>
#include <iostream>
#include <boost/beast/core/static_string.hpp>
boost::beast::static_string<16> s1("abc");

int main(){
    boost::beast::static_string<16> s2;
    std::copy_n((char*)&s1, sizeof(s2), (char*)&s2);
    s1.push_back('X');
    std::cout << "--" << std::endl;
    std::cout << s2 << std::endl;
    s2.push_back('Y');
    std::cout << s2 << std::endl;
    std::cout << std::is_trivial_v<decltype(s2)> << std::endl;
}

注意:最后一行说类型不可简单复制,但可能只是 Vinnie 忘记添加类型特征。

P.S。我知道这通常是个坏主意,我要替换的东西更糟,只是一个普通的 C 数组并修改 allocation/copying 以支持 std::string 需要更多的工作。

技术上没有,有用户定义的复制构造函数和运算符(都调用 assign),这意味着 class 不是 trivially copyable

这些似乎作为一种优化而存在,如果 static_string 的大小很大,但只存储一个小的字符串,assign 只复制字符串的使用部分,加上一个空终止符.

C++ 不允许 std::is_trivially_copyable 被程序特化,所以我认为目前没有办法同时获得这两者。

static_string 确实只包含一个 size_t 成员和一个 CharT[N+1],所以如果这两个是默认的,那就是。