[英]static_cast between primitive references
是使用static_cast
從const 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
。
我認為這在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
是非類型類型,則創建臨時類型為cv1T1
並從初始化表達式復制初始化。 然后將引用綁定到臨時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.