我知道C++不支持容器元素的協方差,就像在Java或C#中一樣。所以,可能是下面的代碼是未定義的行爲:C++中的容器協方差
#include <vector>
struct A {};
struct B : A {};
std::vector<B*> test;
std::vector<A*>* foo = reinterpret_cast<std::vector<A*>*>(&test);
毫不奇怪,我建議這個解決another question時收到downvotes。
但是,C++標準的哪一部分完全告訴我,這會導致未定義的行爲?它確保std::vector<A*>
和std::vector<B*>
將它們的指針存儲在一個連續的內存塊中。它也保證sizeof(A*) == sizeof(B*)
。最後,A* a = new B
是完全合法的。
那麼標準中有什麼不好的精神讓我想起(風格除外)?
使用該點沒有後的reinterpret_cast <>()的定義。它可能有效,但你的條件列表非常短。我會再添加一些前提條件。 sizeof(A)== sizeof(B); A或B都不能包含任何類型的虛擬功能。 A和B以及放置在數組中的任何後代都不能使用多重繼承。 – 2011-01-26 17:28:03
非C++的具體答案是它不是類型安全的。如果您將「A」添加到foo中,則您的測試處於無效狀態,因爲它確保所有元素均爲「B」類型。而C#也不支持這個。 C#僅支持以安全方式(僅用於輸入或輸出)且僅用於接口和委託的通用參數。 Java支持它,因爲它增加了運行時檢查,並在內部工作在對象基類上。 – CodesInChaos 2011-01-26 17:30:06
這個問題看起來類似於http://stackoverflow.com/questions/842387/how-do-i-dynamically-cast-between-vectors-of-pointers – Nekuromento 2011-01-26 17:36:39