10

私はこれをあきらめます...

$ 5.2.7 / 2- "Tがポインター型の場合、vは完全なクラス型へのポインターの右辺値であり、結果はタイプTの右辺値になります。Tが参照型の場合、vはの左辺値になります。完全なクラス型であり、結果はTによって参照される型の左辺値です。」

上記に従って、次のコードは整形式である必要があります。

struct A{};
struct B : A{};

int main(){
   B b;
   A a, &ar1 = b;

   B& rb1 = dynamic_cast<B&>(ar1);  // Does not $5.2.7/2 apply here?
   B& rb2 = dynamic_cast<B&>(a);    // and also here?
}

そうではありません。すべてのコンパイラは、dynamic_castのオペランドがポリモーフィックではないことについて不平を言います。

$ 5.2.7 / 6-それ以外の場合、vはポリモーフィック型(10.3)へのポインタまたは左辺値になります。

だから私の質問は$5.2.7/ 2はどういう意味ですか?なぜ$5.2.7/ 6がここで始まるのですか?

4

3 に答える 3

9

さて、5.2.7のすべての要件を一緒に遵守する必要があります。5.2.7 / 2の後で停止して、「5.2.7/2まで」すべてを満たすと思われるコードを書き始めることはできません。5.2.7全体で、の仕様が定義されていますdynamic_cast

多型要件は条件付きであるため、選択されています。アップキャストに使用する場合dynamic_cast、ポリモーフィック要件は適用されません(実際、アップキャストの場合dynamic_castと同等static_castです)。dynamic_castポリモーフィック要件は、ダウンキャストまたはクロスキャストに使用する場合にのみ適用されます。

の仕様dynamic_castは順番に整理されています。つまり、最初に単純なケースを処理してから、より複雑なアプリケーションに進みます。それがあなたの特定の状況をカバーするまで、あなたはそれを段階的に読むことになっています。そのパスに沿って読んだものはすべて累積的に適用されます。「それ以外の場合」とは、「まだケースをカバーしていない場合は、読み続けてください」という意味です。

于 2010-11-17T10:39:27.733 に答える
4

あなたの例のようにダウンキャストを行うには、構造体Aが多型であり、RTTIを持っている必要があります。これが、ある程度まで機能する調整済みバージョンです。

struct A{virtual void f(){}};
struct B : A{};

int main(){
   B b;
   A a, &ar1 = b;

   B& rb1 = dynamic_cast<B&>(ar1);  // Does not $5.2.7/2 apply here?
   //B& rb2 = dynamic_cast<B&>(a);    // and also here?
}

仮想を追加してポリモーフィックにすることで、クラスに対してRTTIが有効になり、ダウンキャストが可能になります。

aポッド( )をポッドへの参照にキャストしているため、2番目の例は機能しないことに注意してください。これは許可されていません。


アップデート:

あなたのコードは5.2.7.5では許可されておらず、5.2.7.6でも許可されていません。私の調整により、5.2.7.6で機能します

于 2010-11-17T10:52:08.497 に答える
3

この場合の「その他」とは、「5.2.7/5の条件が適用されない限り」を意味します。

/ 2は、のオペランドに関する要件をプログラムに課しているため、これを知ることができますdynamic_cast(「vは左辺値である」の「shall」言語と「結果は左辺値」の「is」言語に注意してください) 。標準の他の場所と同様に、要件を表現することは、必ずしもそれが唯一の要件であることを意味するわけではありません。他の条項は、追加の要件を述べることができます。この場合、/ 6は、Tおよびvの静的タイプに応じて、特定の場合にのみ適用される追加の要件を示します。

/ 3、/ 4、/ 5は結果のを示しており、/2の要件と完全に一致しています。それらのどれも「その他」で始まりません。したがって、私には、それらが/2から始まる「elseif」チェーンを形成しないことはかなり明白です。

角かっこなどによって、これが明確になる場合があります(つまり、/ 6の「otherwise」は/5の「if」に適用され、/ 2、/ 3、または/ 4の「if」には適用されません)。しかし、それは家のスタイルではありません。

他のことは別として、/ 5の「その他」は、論理的に/2の条件に意味のある形で適用することはできません。/ 1は、Tが「完全なクラスタイプまたはcv へのポインタまたは参照」でなければならないことを示していますvoid*。/ 2は、ポインタ型と参照型の2つのケースをカバーしています。それがすべてです。/ 2には「その他」はありません(「そうでない場合、準拠コンパイラは診断を発行する必要があります」と言われない限り、それは暗黙的です)

于 2010-11-17T10:54:47.583 に答える