簡體   English   中英

為什么不允許這個static_cast?

[英]Why is this static_cast not allowed?

我有一個A類的對象,我想在自定義堆棧對象上分配。 為此,我只需將堆棧指針移動到對象大小的字節數並返回其先前的值:

class A : public B {}; //B is from a precompiled library

class stack {
public:
    stack(void): _top(&_storage[0]) {}

    template <typename T>
    inline T* push(void) {
        T* ptr = static_cast<T*>(_top);

        _top += sizeof(T);

        return ptr;
    }

    //...

private:
    char _storage[1024];
    char* _top;
};

stack _stack;

int main(int argc, char** argv) {
    A* a = _stack.push<A>(); //ignore the lack of a constructor call

    return 0;
}

Visual C ++只是告訴我static_cast無法從char *轉換為A *。 常規的C樣式轉換不會給我這個錯誤,但我寧願更明確並避免動態轉換(A繼承自另一個類,但沒有貢獻給它沒有的vtable)。 在這種情況下兩者之間有什么區別嗎?

按設計。

static_cast轉換不是為了在不相關的指針類型之間進行轉換,因為您需要使用reinterpret_cast 如果你想明確你正在做的演員,那么使用正確的演員。 在這種情況下,C樣式轉換將執行reinterpret_cast

你真的需要研究不同的強制轉換操作符,因為對dynamic_cast的評論也沒有多大意義。

正如其他人所說,解決方案是使用reinterpret_cast ,它意味着在不相關的指針類型之間進行轉換時使用:

T* ptr = reinterpret_cast<T*>(_top);

如果你使用placement new ,你不僅可以避免出現問題,還可以解決不為具有構造函數的類型調用構造函數的問題:

T* ptr = new(_top) T();

沒有從char *到A *的隱式或顯式轉換。 您希望reinterpret_cast <>執行此類型的強制轉換。

有關更多詳細信息,請參閱此SO答案

暫無
暫無

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

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