[英]Is the c++ code in standard library all valid c++?
出於好奇,我查看了std::is_pointer
的實現方式並看到了類似這樣的內容(多個重載之一):
template <class _Ty>
_INLINE_VAR constexpr bool is_pointer_v<_Ty*> = true;
如果我復制並粘貼到我的代碼中並編譯說 constexpr 在這里無效。 怎么了?
std::is_pointer
和std::is_reference
類的結構體是否可以由我們實現? (不是我會,只是好奇所以請不要來找我)
使用 msvc 2019 的 MRE:
template <class _Ty>
inline constexpr bool is_pointer_v<_Ty*> = true;
int main()
{
}
--
Error: error C7568: argument list missing
after assumed function template 'is_pointer_v'
回答標題中的問題:
不,標准庫代碼不需要遵守用戶代碼的語言規則。 從技術上講,它甚至不需要在 C++ 中實現,但可以直接集成到編譯器中。
然而,實際上標准庫代碼總是像用戶代碼一樣由編譯器編譯,因此它不會使用編譯器拒絕用戶代碼的任何語法結構。 然而,它將使用特定於編譯器的擴展並保證用戶代碼通常不應依賴。 並且在標准中也有一些專門針對標准庫實現的保留。
例如,您從標准庫實現中顯示的片段不是有效的用戶代碼,因為_Ty
是用戶代碼可能不會使用的保留標識符,因為它以下划線開頭,后跟大寫字母。 此類標識符專門保留給標准庫實現。 僅出於這個原因,大多數標准庫代碼將不是有效的用戶代碼。
您在這里使用的是部分模板專業化。 您需要模板的完整聲明才能編譯該代碼,如下所示:
template <class _Ty>
inline constexpr bool is_pointer_v = false;
template <class _Ty>
inline constexpr bool is_pointer_v<_Ty*> = true;
請參閱此處以獲取示例代碼
要回答您的問題,STL 實現需要編譯器實現的特定 C++ 原語以支持所需的 API。如果編譯器未實現 STL,則不能擁有constexpr
版本。
如果沒有一些特定於編譯器的代碼和操作系統的原語,就不可能實現完整的 STL。 這因系統而異(例如,您不能在 windows 上使用 linux 的 STL 實現)。 它依賴於未定義的行為,以及許多已知適合特定編譯器的優化。
例如,如果 C++ 中沒有 UB,則無法實現類型雙關(即從float*
轉換為int*
和取消引用)(請參見此處和此處)
您必須依賴 memcpy,但如果沒有 UB 代碼(如果您編寫編譯器,那么定義明確,順便說一句),那將無法實現,因為 memcpy 訪問的 memory 可能不在它聲明的初始類型中。
然而,您始終可以從您的系統中復制並粘貼 STL 代碼,它始終會在您的編譯器上正確構建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.