2017-09-23 42 views
-1
cppreference.com嚴格別名規則

一兩個例外說:嚴格別名例外解釋

  • AliasedType是(可能被cv修飾)DynamicType
  • AliasedType和DynamicType都(可能是多層次的,有可能CV-合格每一級)指向相同類型T(因爲C++ 11)

我不清楚地理解迪菲在這些案件之間保持一致。 例如:

struct B { virtual ~B() {} }; 
struct D : B {}; 

B* b = new D; 
reinterpret_cast<D*>(b); 

上面的代碼是否適合這兩種情況?

據我看到AliasedTypeDynamicType和兩者都是D(第一殼體)和它們指向相同類型D

如果我錯了,你能提供每個單獨案例的例子,並更清楚地解釋差異?

+0

cppreference在這裏是錯誤的。不能'reinterpret_cast'指向派生指針的基指針或返回,然後取消引用轉換的指針,而不管對象的動態類型如何。 –

+0

@ n.m。你能否提供任何有關標準的參考? – alexolut

+0

6.9.2p4。「如果...,兩個對象a和b是指針可互換的。」只有第一個基類子對象被允許,並且只有當對象具有標準佈局時。 –

回答

2

要了解的聲明那裏,你必須認識到,DynamicType對象,並AliasedType用於訪問該值的表達式類型的類型。但演員本身不是從DynamicTypeAliasedType,而是從DynamicType*AliasedType*

現在,C++有多級指針。 DynamicType可能是一些A*AliasedType可能是一些B*,可能cv資格。因此,DynamicType*將是A**。這就是爲什麼你需要第二種情況。 AliasedType可能是A const*,它不同於A*。因此,它不包含在第一條規則下(A const*而不是A*的cv合格版本,不像A* const)。

現在,至於你的代碼:你的對象的DynamicTypeD,這是從new D非常明顯。 D而不是指針類型,它是一個類的類型。這意味着只有符合cv標準的變體可以替代它:volatile D,const Dconst volatile D

但是,您沒有指向該D對象的指針,您有一個指向其B子對象的指針。此子對象可通過一個別名等B const

你在做什麼嘗試使用DAliasedType來訪問的B子對象。這是行不通的 - D是不符合cv資格B。他們與繼承有關,而不是簡歷資格。

+0

也可以參考。但是,這兩種情況下的真實例子呢?我的代碼是否完全錯誤@ n.m。說過? – alexolut

+0

@alexolut:是的。 – MSalters

+0

您是否可以將正確的代碼片段添加到上述兩種情況的答案中?我認爲在這種情況下答案會完成,我可以接受。 – alexolut

相關問題