當我在標題中遇到以下內容時,我正在查看一些標準庫的常用容器( , 等...)的實作vector:unordered_mapxutility
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*type 然后立即轉換為const char*?我假設它是為了阻止編譯器過早優化,對于某些特定情況,但沒有具體的例子浮現在腦海中。
uj5u.com熱心網友回復:
如果指標的目標型別是volatile-qualified,則無法使用reinterpret_castto 直接強制轉換為const char*。
reinterpret_cast不準扔掉const或volatile。const_cast然而可以做到這一點,同時不能改變指標的目標型別本身。
我認為 C 風格的強制轉換在這種情況下也總是有效,但推理起來有點困難,因為它嘗試了多個 C 風格的轉換序列,只有最后一個是 areinterpret_cast后跟 a const_cast。
在這里不使用 C 樣式轉換可能只是一種樣式選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413498.html
標籤:
上一篇:按鍵精靈關于抖音引流這件事。
