簡體   English   中英

原始引用之間的static_cast

[英]static_cast between primitive references

是使用static_castconst unsigned char&轉換為const unsigned long long& defined?

constexpr unsigned char arr[sizeof(unsigned long long)]{ 1 };
constexpr bool value = static_cast<const unsigned long long&>(arr[0]) == 1;

拋出int main(){}並且在Coliru,Ideone和VS2015上編譯時沒有錯誤或警告。 這實際上是安全的,還是不安全但不要求出錯?

獎勵:我沒想到arr[0]會是一個常量表達式,但是使用value作為常量表達式可以正常運行。 是因為arr是一個數組嗎?

*它未定義,因為您通過引用另一種類型使用一種類型。 *您使用了強制轉換,因此編譯器應該信任您是否可以執行該強制轉換。 *它通常會以您期望的方式工作,除了我懷疑大多數架構上的價值都是正確的。

實際上我認為這里發生的是const和你施放到一個臨時的,或者如果它發生在運行時。 所以是的,你應該從價值中得到1 char 1將被復制到unsigned long long ,const&將綁定到它。 它不會綁定到你不認為的數組。 這將是完全安全的,您可以忽略上述大部分內容。

您可以通過嘗試轉換為左值來測試這個想法。 你不得不讓你的數據成為constexpr

http://ideone.com/TxYose

我認為這在C ++ 14中的[expr.static.cast] / 4中有所涉及:

表達式e可以顯式轉換到類型T使用static_cast形式static_cast<T>(e) ,如果聲明T t(e); 對於一些發明的臨時變量t 這種顯式轉換的效果與執行聲明和初始化,然后使用臨時變量作為轉換結果相同。

這將您的代碼定義為等效於:

constexpr unsigned char arr[sizeof(unsigned long long)]{ 1 };

const unsigned long long &t (arr[0]);

constexpr bool value = (t == 1);

第二行現在很熟悉:在[dcl.init.ref] / 5下允許從不同(非參考相關)類型的值初始化const引用:

如果T1是非類型類型,則創建臨時類型為cv1 T1並從初始化表達式復制初始化。 然后將引用綁定到臨時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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