constexpr环境下const char*转const uint8_t*的可行解决方案咨询
解决constexpr环境下std::string_view到uint8_t指针的转换问题
你遇到的核心问题是:std::string_view::data()返回const char*,而你需要的是const uint8_t*,但constexpr环境下禁止使用reinterpret_cast。以下是两种可行的解决方法:
方法1:通过void*静态转换(C++17及以上)
利用C++标准允许的指针转换规则,先将const char*转为const void*,再转为const uint8_t*,这种转换能在constexpr环境中正常编译:
#include <cstddef> #include <cstdint> #include <initializer_list> #include <string_view> class Test { public: constexpr Test(std::initializer_list<uint8_t> list): _size(list.size()), _data(std::data(list)) { } constexpr Test(std::string_view str): _size(str.size()), _data(static_cast<const uint8_t*>(static_cast<const void*>(str.data()))) { } constexpr const uint8_t* data() const { return _data; } constexpr size_t size() const { return _size; } private: size_t _size; const uint8_t* _data; };
方法2:基于uint8_t的typedef本质(全C++版本兼容)
由于uint8_t在绝大多数平台上是unsigned char的typedef,你可以先将const char*转为const unsigned char*,再赋值给const uint8_t*,这种转换同样符合constexpr要求:
// 仅修改string_view构造函数部分 constexpr Test(std::string_view str): _size(str.size()), _data(static_cast<const unsigned char*>(static_cast<const void*>(str.data()))) { }
关键说明
- 这两种转换的合法性来自C++标准:
char、unsigned char和字节类型的指针可以通过void*互相转换,且转换后指针值不变,不会引入未定义行为。 - 虽然
uint8_t的typedef依赖平台,但目前几乎所有主流平台都将其定义为unsigned char,无需担心兼容性问题。
内容的提问来源于stack exchange,提问作者Patrick Wright
相关产品推荐
相关产品推荐

