簡體   English   中英

C ++ Cast的實現

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

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