簡體   English   中英

標准庫中的c++代碼都是有效的c++嗎?

[英]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_pointerstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM