[英]Implementation of C++ Cast
我在CodeProject中瀏覽了一些代碼,並遇到了以下C ++轉換代碼。
template <class OutputClass, class InputClass>
union horrible_union{
OutputClass out;
InputClass in;
};
template <class OutputClass, class InputClass>
inline OutputClass horrible_cast(const InputClass input){
horrible_union<OutputClass, InputClass> u;
u.in = input;
return u.out;
}
為什么演員以上述方式實施。 為什么我們不能只做一個手動演員。 有人可以舉例說明正常演員何時不能奏效?
這種方法基本上可以讓你逃脫任何演員,雖然它依賴於未定義的行為。
在不相關的類型之間進行投射時,正常演員會抱怨,而這不會。
struct A{};
struct B{};
template <class OutputClass, class InputClass>
union horrible_union{
OutputClass out;
InputClass in;
};
template <class OutputClass, class InputClass>
inline OutputClass horrible_cast(const InputClass input){
horrible_union<OutputClass, InputClass> u;
u.in = input;
return u.out;
}
int main()
{
A a;
B b;
a = horrible_cast<A,B>(b); //this compiles
a = reinterpret_cast<A>(b); //this doesn't
}
底線:太可怕了,不要這樣做。
以這種方式使用聯合通常大致相當於指針的硬reinterpret_cast
。 但是,這不會復制對象,你的例子確實如此(事實上,甚至使用RVO兩次;將const InputClass& input
作為參數會更有效率)。 因此,您可以直接對其結果進行操作,而不會改變原始對象。
究竟這對......有用。 我不認為有任何非常好的用例,應該始終避免使用未經檢查的強制轉換,並且正如David Hammen所說,這個實際上是完全未定義的(盡管它通常會起作用,如果“正確使用”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.