为什么 MSVC 的 STL 实现在这里转换为 const volatile char*?
Why does MSVC's STL implementation cast to const volatile char* here?
当我在 xutility
header:
template <class _CtgIt, class _OutCtgIt>
_OutCtgIt _Copy_memmove(_CtgIt _First, _CtgIt _Last, _OutCtgIt _Dest) {
auto _FirstPtr = _To_address(_First);
auto _LastPtr = _To_address(_Last);
auto _DestPtr = _To_address(_Dest);
const char* const _First_ch = const_cast<const char*>(reinterpret_cast<const volatile char*>(_FirstPtr));
const char* const _Last_ch = const_cast<const char*>(reinterpret_cast<const volatile char*>(_LastPtr));
char* const _Dest_ch = const_cast<char*>(reinterpret_cast<const volatile char*>(_DestPtr));
const auto _Count = static_cast<size_t>(_Last_ch - _First_ch);
_CSTD memmove(_Dest_ch, _First_ch, _Count);
if constexpr (is_pointer_v<_OutCtgIt>) {
return reinterpret_cast<_OutCtgIt>(_Dest_ch + _Count);
} else {
return _Dest + (_LastPtr - _FirstPtr);
}
}
有人知道为什么 _First_ch
和 _Last_ch
首先转换为 const volatile char*
类型然后立即转换为 const char*
吗?我假设它是为了阻止编译器针对某些特定情况过早优化,但没有想到具体的例子。
如果指针的目标类型是volatile
限定的,则无法使用reinterpret_cast
直接转换为const char*
。
reinterpret_cast
不允许丢弃const
或volatile
。 const_cast
然而可以做到这一点,同时不能改变指针的目标类型本身。
我认为 C 风格的转换在这种情况下也总是有效,但对其进行推理有点困难,因为它尝试了多个 C++ 风格的转换序列,只有最后一个是 reinterpret_cast
后跟 const_cast
.
这里不使用 C 风格的转换可能只是一种风格选择。
当我在 xutility
header:
template <class _CtgIt, class _OutCtgIt>
_OutCtgIt _Copy_memmove(_CtgIt _First, _CtgIt _Last, _OutCtgIt _Dest) {
auto _FirstPtr = _To_address(_First);
auto _LastPtr = _To_address(_Last);
auto _DestPtr = _To_address(_Dest);
const char* const _First_ch = const_cast<const char*>(reinterpret_cast<const volatile char*>(_FirstPtr));
const char* const _Last_ch = const_cast<const char*>(reinterpret_cast<const volatile char*>(_LastPtr));
char* const _Dest_ch = const_cast<char*>(reinterpret_cast<const volatile char*>(_DestPtr));
const auto _Count = static_cast<size_t>(_Last_ch - _First_ch);
_CSTD memmove(_Dest_ch, _First_ch, _Count);
if constexpr (is_pointer_v<_OutCtgIt>) {
return reinterpret_cast<_OutCtgIt>(_Dest_ch + _Count);
} else {
return _Dest + (_LastPtr - _FirstPtr);
}
}
有人知道为什么 _First_ch
和 _Last_ch
首先转换为 const volatile char*
类型然后立即转换为 const char*
吗?我假设它是为了阻止编译器针对某些特定情况过早优化,但没有想到具体的例子。
如果指针的目标类型是volatile
限定的,则无法使用reinterpret_cast
直接转换为const char*
。
reinterpret_cast
不允许丢弃const
或volatile
。 const_cast
然而可以做到这一点,同时不能改变指针的目标类型本身。
我认为 C 风格的转换在这种情况下也总是有效,但对其进行推理有点困难,因为它尝试了多个 C++ 风格的转换序列,只有最后一个是 reinterpret_cast
后跟 const_cast
.
这里不使用 C 风格的转换可能只是一种风格选择。