2010-03-29 26 views

回答

3

offsetof僅指定用於POD類型。如果一個類包含任何不是POD的數據成員,則該類本身不是POD。因此,如果您的示例中的t是非POD類型,則不能保證能夠正常工作。

從C++標準(18.1/5):

offsetof接受該國際標準一組受限的type參數。 type應是POD結構或POD結合。

因此,如果在非POD類型上使用offsetof,結果是未定義的。

+0

好,但那不是我問的。例如, class foo {int i; virtual void bar(){ } }; int main(){ std :: cout << TYPE_ALIGNMENT(foo)<< std :: endl; return 0; } 工作正常(在Linux x86-64上使用GCC 4.4.3),據我所知未定義至少有一些情況下,它不工作。或者是我對未定義的錯誤的理解? – JustMaximumPower 2010-03-29 14:08:13

+0

@JustMaximumPower:「工作正常」(或者至少看起來工作正常)對於未定義的東西是合理的結果。 「可怕的撞車」是另一個合理的結果。任何事情都可能發生。無論它是否工作或者它在您的軟件中導致有害的錯誤完全取決於實施。假設它適用於非POD類型是不明智的。 – 2010-03-29 14:30:48