C++20中严格的别名规则是否允许在标准c++unicode字符和下划线类型之间使用`represtrate_cast`?
C++20
的严格的别名规则[basic.lval]/11是否任意允许...
- 在
char*
和char8_t*
之间强制转换
string str = "string";
u8string u8str { (char8_t*) &*str.data() }; // c++20 u8string
u8string u8str2 = u8"z?水??"
string str2 { (char*) u8str2.data() };
- 在
uint32_t*
、uint_least32_t*
和char32_t*
之间强制转换
vector<uint32_t> ui32vec = { 0x007a, 0x00df, 0x6c34, 0x0001f34c };
u32string u32str { (char32_t*) &*ui32vec.data(), ui32vec.size() };
u32string u32str2 = U"z?水??"
vector<uint32_t> ui32vec2 { (uint32_t*) &*u32str2.begin(),
(uint32_t*) &*u32str2.end() };
- 在
uint16_t*
、uint_least16_t*
和char16_t*
之间强制转换
vector<uint16_t> ui16vec = { 0x007a, 0x00df, 0x6c34, 0xd83c, 0xdf4c };
u16string u16str { (char16_t*) &*ui16vec.data(), ui16vec.size() };
u16string u16str2 = u"z?水ud83cudf4c"
vector<uint16_t> ui16vec2 { (uint16_t*) &*u16str2.begin(),
(uint16_t*) &*u16str2.end() };
更新
基本字符串构造器overload (6)
template< class InputIt >
basic_string( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
向量构造器overload (4)
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
我想知道是否可以使用LegacyInputIterator构造函数?...
char*
和char8_t*
作为LegacyInputIterator
string str = "string";
u8string u8str { str.begin(), str.end() };
u8string u8str { &*str.begin(), &*str.end() };
u8string u8str2 = u8"z?水??"
string str2 { u8str2.begin(), u8str2.end() };
string str2 { &*u8str2.begin(), &*u8str2.end() };
uint32_t*
、uint_least32_t*
和char32_t*
作为LegacyInputIterator
vector<uint32_t> ui32vec = { 0x007a, 0x00df, 0x6c34, 0x0001f34c };
u32string u32str { ui32vec.begin(), ui32vec.end() };
u32string u32str { &*ui32vec.begin(), &*ui32vec.end() };
u32string u32str2 = U"z?水??"
vector<uint32_t> ui32vec2 { u32str2.begin(),
u32str2.end() };
vector<uint32_t> ui32vec2 { &*u32str2.begin(),
&*u32str2.end() };
uint16_t*
、uint_least16_t*
和char16_t*
作为LegacyInputIterator
vector<uint16_t> ui16vec = { 0x007a, 0x00df, 0x6c34, 0xd83c, 0xdf4c };
u16string u16str { ui16vec.begin(), ui16vec.end() };
u16string u16str { &*ui16vec.begin(), &*ui16vec.end() };
u16string u16str2 = u"z?水ud83cudf4c"
vector<uint16_t> ui16vec2 { u16str2.begin(),
u16str2.end() };
vector<uint16_t> ui16vec2 { &*u16str2.begin(),
&*u16str2.end() };
解决方案
char*_t
行类型没有任何特殊别名规则。因此,standard rules apply。并且这些规则对于基础类型之间的转换没有例外。
所以你所做的大部分都是UB。唯一不是UB的病例是char
,因为它的特殊性质。实际上,您可以将char8_t
的字节读取为char
的数组。但您不能做相反的事情,将char
数组的字节读取为char8_t
。
现在,这些类型可以相互完全转换。因此,您可以随时将这些数组中的值转换为其他类型。
尽管如此,在真正的实现中,这些事情几乎肯定会奏效。好的,直到他们不这样做,因为你试图通过一个不应该改变的东西来改变一件事,编译器不会重新加载改变的值,因为它假设它不可能被改变。所以说真的,只要使用正确的、有意义的类型即可。相关文章