C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103

# はじめに(Introduction)
C++N4741 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4741.pdf

C++N4741は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, TOPPERSカーネル、g++(GCC), clang++(LLVM）との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。

## 背景(back ground)
C/C++でコンパイルエラーが出ると、途方にくれることがしばしばあります。
何回かに１回は、該当するエラーが検索できます。
ただ、条件が違っていて、そこでの修正方法では目的を達成しないこともしばしばです。いろいろな条件のコンパイルエラーとその対応方法について、広く記録することによって、いつか同じエラーに遭遇した時にやくに立つことを目指しています。

この半年の間で、三度、自分のネットでの記録に助けられたことがあります。
また過去に解決できなかった記録を１０種類以上、最近になって解決できたことがあります。それは、主に次の３つの情報に基づいています。
https://stackoverflow.com
https://cpprefjp.github.io
http://ja.cppreference.com/

また
https://researchmap.jp/joub9b3my-1797580/#_1797580
に記載したサイトのお世話になっています。

## 作業方針(sequence)
Clang++では-std=c++03, c++17, C++2aの３種類
g++では-std=c++03, c++17の２種類
vc++(visual studio 2017)ではC++17の１種類
でコンパイルし、

１）コンパイルエラーを収集する。
２）コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
３）リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
４）意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。

１）だけのものから４）まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。

初めての　CEDD(Compile Error Driven Design) ８回直してコンパイル。
https://qiita.com/kaizen_nagoya/items/9494236aa1753f3fd1e1

https://qiita.com/kaizen_nagoya/items/85c0e92b206883140e89#_reference-f5ba2535f9b0e314ab73コンパイルエラーを記録するとよい理由7つ

##C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010

## C++N4606, 2016符号断片編纂一覧(example code compile list)
C++N4606, 2016 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

##C++N3242, 2011 sample code compile list on clang++ and g++
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318

## 編纂器(Compiler)
###clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-apple-darwin17.4.0

###g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

###cl(visual studio 2017)
Microsoft(R) C/C++ Optimizing Compiler Version 19.15.26726 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.
#(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103

C++N4606, 2016 (39)5.2.2 Function call [expr.call]p108
https://qiita.com/kaizen_nagoya/items/6a98435a981a5bad60a7

No sample at C++N3242, 2011

##p103.cpp
###算譜(source code)

```c++:p103.cpp
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
const char* msg= "C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>
#include <cstdlib>
#include <cassert>

using namespace std;


struct B { };
struct D : B { };
void foo(D* dp) {
  B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}


class A {
  virtual void f();
};
class B {
  virtual void g();
};
class D : public virtual A, private B { };
void g() {
  D d;
  B* bp = (B*)&d; // cast needed to break protection
  A* ap = &d; // public derivation, no cast needed
  D& dr = dynamic_cast<D&>(*bp); // fails
  ap = dynamic_cast<A*>(bp); // fails
  bp = dynamic_cast<B*>(ap); // fails
  ap = dynamic_cast<A*>(&d); // succeeds
  bp = dynamic_cast<B*>(&d); // ill-formed (not a runtime check)
}
class E : public D, public B { };
class F : public E, public D { };
void h() {
  F f;
  A* ap = &f; // succeeds: finds unique A
  D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
  E* ep = (E*)ap; // ill-formed: cast from virtual base
  E* ep1 = dynamic_cast<E*>(ap); // succeeds
}

int main() {
  cout<< msg << endl;
  return EXIT_SUCCESS;
}
```

###編纂・実行結果(compile and go)


```shell-session:cpla.sh
$ ../cpla.sh p103
$ clang++ p103.cpp -std=c++03 -Wall
p103.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
   ^
p103.cpp:21:7: error: redefinition of 'B'
class B { virtual void g(); };
      ^
p103.cpp:13:8: note: previous definition is here
struct B { };
       ^
p103.cpp:22:7: error: redefinition of 'D'
class D : public virtual A, private B { };
      ^
p103.cpp:14:8: note: previous definition is here
struct D : B { };
       ^
p103.cpp:26:4: error: cannot initialize a variable of type 'A *' with an rvalue of type
      'D *'
A* ap = &d; // public derivation, no cast needed
   ^    ~~
p103.cpp:27:9: error: 'B' is not polymorphic
D& dr = dynamic_cast<D&>(*bp); // fails
        ^                ~~~
p103.cpp:28:6: error: 'B' is not polymorphic
ap = dynamic_cast<A*>(bp); // fails
     ^                ~~
p103.cpp:30:6: error: 'D' is not polymorphic
ap = dynamic_cast<A*>(&d); // succeeds
     ^                ~~
p103.cpp:33:21: warning: direct base 'B' is inaccessible due to ambiguity:
    class E -> struct D -> struct B
    class E -> struct B [-Winaccessible-base]
class E : public D, public B { };
                    ^~~~~~~~
p103.cpp:34:21: warning: direct base 'D' is inaccessible due to ambiguity:
    class F -> class E -> struct D
    class F -> struct D [-Winaccessible-base]
class F : public E, public D { };
                    ^~~~~~~~
p103.cpp:37:4: error: cannot initialize a variable of type 'A *' with an rvalue of type
      'F *'
A* ap = &f; // succeeds: finds unique A
   ^    ~~
3 warnings and 7 errors generated.
$ clang++ p103.cpp -std=c++2a -Wall
p103.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
   ^
p103.cpp:21:7: error: redefinition of 'B'
class B { virtual void g(); };
      ^
p103.cpp:13:8: note: previous definition is here
struct B { };
       ^
p103.cpp:22:7: error: redefinition of 'D'
class D : public virtual A, private B { };
      ^
p103.cpp:14:8: note: previous definition is here
struct D : B { };
       ^
p103.cpp:26:4: error: cannot initialize a variable of type 'A *' with an rvalue of type
      'D *'
A* ap = &d; // public derivation, no cast needed
   ^    ~~
p103.cpp:27:9: error: 'B' is not polymorphic
D& dr = dynamic_cast<D&>(*bp); // fails
        ^                ~~~
p103.cpp:28:6: error: 'B' is not polymorphic
ap = dynamic_cast<A*>(bp); // fails
     ^                ~~
p103.cpp:30:6: error: 'D' is not polymorphic
ap = dynamic_cast<A*>(&d); // succeeds
     ^                ~~
p103.cpp:33:21: warning: direct base 'B' is inaccessible due to ambiguity:
    class E -> struct D -> struct B
    class E -> struct B [-Winaccessible-base]
class E : public D, public B { };
                    ^~~~~~~~
p103.cpp:34:21: warning: direct base 'D' is inaccessible due to ambiguity:
    class F -> class E -> struct D
    class F -> struct D [-Winaccessible-base]
class F : public E, public D { };
                    ^~~~~~~~
p103.cpp:37:4: error: cannot initialize a variable of type 'A *' with an rvalue of type
      'F *'
A* ap = &f; // succeeds: finds unique A
   ^    ~~
3 warnings and 7 errors generated.

$ g++-8 p103.cpp -std=c++03  -Wall
p103.cpp: In function 'void foo(D*)':
p103.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
 B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
    ^~
p103.cpp: At global scope:
p103.cpp:21:7: error: redefinition of 'class B'
 class B { virtual void g(); };
       ^
p103.cpp:13:8: note: previous definition of 'class B'
 struct B { };
        ^
p103.cpp:22:7: error: redefinition of 'class D'
 class D : public virtual A, private B { };
       ^
p103.cpp:14:8: note: previous definition of 'class D'
 struct D : B { };
        ^
p103.cpp: In function 'void g()':
p103.cpp:26:10: error: cannot convert 'D*' to 'A*' in initialization
 A* ap = &d; // public derivation, no cast needed
          ^
p103.cpp:27:29: error: cannot dynamic_cast '* bp' (of type 'class B') to type 'class D&' (source type is not polymorphic)
 D& dr = dynamic_cast<D&>(*bp); // fails
                             ^
p103.cpp:28:25: error: cannot dynamic_cast 'bp' (of type 'class B*') to type 'class A*' (source type is not polymorphic)
 ap = dynamic_cast<A*>(bp); // fails
                         ^
p103.cpp:30:25: error: cannot dynamic_cast '& d' (of type 'class D*') to type 'class A*' (source type is not polymorphic)
 ap = dynamic_cast<A*>(&d); // succeeds
                         ^
p103.cpp:27:4: warning: unused variable 'dr' [-Wunused-variable]
 D& dr = dynamic_cast<D&>(*bp); // fails
    ^~
p103.cpp: At global scope:
p103.cpp:33:7: warning: direct base 'B' inaccessible in 'E' due to ambiguity
 class E : public D, public B { };
       ^
p103.cpp:34:7: warning: direct base 'D' inaccessible in 'F' due to ambiguity
 class F : public E, public D { };
       ^
p103.cpp: In function 'void h()':
p103.cpp:37:10: error: cannot convert 'F*' to 'A*' in initialization
 A* ap = &f; // succeeds: finds unique A
          ^
p103.cpp:38:4: warning: unused variable 'dp' [-Wunused-variable]
 D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
    ^~
p103.cpp:39:4: warning: unused variable 'ep' [-Wunused-variable]
 E* ep = (E*)ap; // ill-formed: cast from virtual base
    ^~
p103.cpp:40:4: warning: unused variable 'ep1' [-Wunused-variable]
 E* ep1 = dynamic_cast<E*>(ap); // succeeds
    ^~~

$ g++-8 p103.cpp -std=c++2a  -Wall
p103.cpp: In function 'void foo(D*)':
p103.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
 B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
    ^~
p103.cpp: At global scope:
p103.cpp:21:7: error: redefinition of 'class B'
 class B { virtual void g(); };
       ^
p103.cpp:13:8: note: previous definition of 'class B'
 struct B { };
        ^
p103.cpp:22:7: error: redefinition of 'class D'
 class D : public virtual A, private B { };
       ^
p103.cpp:14:8: note: previous definition of 'class D'
 struct D : B { };
        ^
p103.cpp: In function 'void g()':
p103.cpp:26:10: error: cannot convert 'D*' to 'A*' in initialization
 A* ap = &d; // public derivation, no cast needed
          ^
p103.cpp:27:29: error: cannot dynamic_cast '* bp' (of type 'class B') to type 'class D&' (source type is not polymorphic)
 D& dr = dynamic_cast<D&>(*bp); // fails
                             ^
p103.cpp:28:25: error: cannot dynamic_cast 'bp' (of type 'class B*') to type 'class A*' (source type is not polymorphic)
 ap = dynamic_cast<A*>(bp); // fails
                         ^
p103.cpp:30:25: error: cannot dynamic_cast '& d' (of type 'class D*') to type 'class A*' (source type is not polymorphic)
 ap = dynamic_cast<A*>(&d); // succeeds
                         ^
p103.cpp:27:4: warning: unused variable 'dr' [-Wunused-variable]
 D& dr = dynamic_cast<D&>(*bp); // fails
    ^~
p103.cpp: At global scope:
p103.cpp:33:7: warning: direct base 'B' inaccessible in 'E' due to ambiguity
 class E : public D, public B { };
       ^
p103.cpp:34:7: warning: direct base 'D' inaccessible in 'F' due to ambiguity
 class F : public E, public D { };
       ^
p103.cpp: In function 'void h()':
p103.cpp:37:10: error: cannot convert 'F*' to 'A*' in initialization
 A* ap = &f; // succeeds: finds unique A
          ^
p103.cpp:38:4: warning: unused variable 'dp' [-Wunused-variable]
 D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
    ^~
p103.cpp:39:4: warning: unused variable 'ep' [-Wunused-variable]
 E* ep = (E*)ap; // ill-formed: cast from virtual base
    ^~
p103.cpp:40:4: warning: unused variable 'ep1' [-Wunused-variable]
 E* ep1 = dynamic_cast<E*>(ap); // succeeds
    ^~~

```
###Visual Studio 2017 
"cl *.cpp /EHsc /std:c++17"

```
p103.cpp(21): error C2011: 'B': 'struct' 型の再定義
p103.cpp(13): note: 'B' の宣言を確認してください
p103.cpp(22): error C2011: 'D': 'struct' 型の再定義
p103.cpp(14): note: 'D' の宣言を確認してください
p103.cpp(24): error C2079: 'd' が 未定義の struct 'D' で使用しています。
p103.cpp(26): error C2440: '初期化中': 'int *' から 'A *' に変換できません。
p103.cpp(26): note: 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
p103.cpp(27): error C2680: 'D &': dynamic_cast のターゲット型が無効です。
p103.cpp(27): note: 'D': dynamic_cast で使用する前にクラスを定義してください。
p103.cpp(27): error C2530: 'dr': 参照が初期化されずに宣言されています。
p103.cpp(28): error C2681: 'B *': dynamic_cast の式の型が無効です。
p103.cpp(29): error C2680: 'B *': dynamic_cast のターゲット型が無効です。
p103.cpp(29): note: 'B': dynamic_cast で使用する前にクラスを定義してください。
p103.cpp(30): error C2681: 'int *': dynamic_cast の式の型が無効です。
p103.cpp(31): error C2680: 'B *': dynamic_cast のターゲット型が無効です。
p103.cpp(31): note: 'B': dynamic_cast で使用する前にクラスを定義してください。
p103.cpp(33): error C2504: 'D': 定義されていない基底クラスが宣言されています。
p103.cpp(33): error C2504: 'B': 定義されていない基底クラスが宣言されています。
p103.cpp(34): error C2504: 'D': 定義されていない基底クラスが宣言されています。
p103.cpp(37): error C2440: '初期化中': 'F *' から 'A *' に変換できません。
p103.cpp(37): note: 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
p103.cpp(38): error C2680: 'D *': dynamic_cast のターゲット型が無効です。
p103.cpp(38): note: 'D': dynamic_cast で使用する前にクラスを定義してください。`

```
##p103a.cpp
リンクエラーの出ないようf(), g()関数定義追加

###算譜(source code)

```c++:p103a.cpp
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
const char* msg= "C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>
#include <cstdlib>
#include <cassert>

using namespace std;

namespace N {
struct B { };
struct D : B { };
void foo(D* dp) {
  B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}
}

class A {
  virtual void f() {};
};
class B {
  virtual void g() {};
};
class D : public virtual A, private B { };
void g() {
  D d;
  B* bp = (B*)&d; // cast needed to break protection
  A* ap = &d; // public derivation, no cast needed
  D& dr = dynamic_cast<D&>(*bp); // fails
  ap = dynamic_cast<A*>(bp); // fails
  bp = dynamic_cast<B*>(ap); // fails
  ap = dynamic_cast<A*>(&d); // succeeds
//bp = dynamic_cast<B*>(&d); // ill-formed (not a runtime check)
}
class E : public D, public B { };
class F : public E, public D { };
void h() {
  F f;
  A* ap = &f; // succeeds: finds unique A
  D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
//E* ep = (E*)ap; // ill-formed: cast from virtual base
  E* ep1 = dynamic_cast<E*>(ap); // succeeds
}

int main() {
  h();
  cout<< msg << endl;
  return EXIT_SUCCESS;
}
```

###編纂・実行結果(compile and go)


```shell-session:cpla.sh
$ ../cpla.sh p103a
$ clang++ p103a.cpp -std=c++03 -Wall
p103a.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
   ^
p103a.cpp:27:4: warning: unused variable 'dr' [-Wunused-variable]
D& dr = dynamic_cast<D&>(*bp); // fails
   ^
p103a.cpp:33:21: warning: direct base 'B' is inaccessible due to ambiguity:
    class E -> class D -> class B
    class E -> class B [-Winaccessible-base]
class E : public D, public B { };
                    ^~~~~~~~
p103a.cpp:34:21: warning: direct base 'D' is inaccessible due to ambiguity:
    class F -> class E -> class D
    class F -> class D [-Winaccessible-base]
class F : public E, public D { };
                    ^~~~~~~~
p103a.cpp:38:4: warning: unused variable 'dp' [-Wunused-variable]
D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
   ^
p103a.cpp:40:4: warning: unused variable 'ep1' [-Wunused-variable]
E* ep1 = dynamic_cast<E*>(ap); // succeeds
   ^
6 warnings generated.
C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103a.cpp
$ clang++ p103a.cpp -std=c++2a -Wall
p103a.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
   ^
p103a.cpp:27:4: warning: unused variable 'dr' [-Wunused-variable]
D& dr = dynamic_cast<D&>(*bp); // fails
   ^
p103a.cpp:33:21: warning: direct base 'B' is inaccessible due to ambiguity:
    class E -> class D -> class B
    class E -> class B [-Winaccessible-base]
class E : public D, public B { };
                    ^~~~~~~~
p103a.cpp:34:21: warning: direct base 'D' is inaccessible due to ambiguity:
    class F -> class E -> class D
    class F -> class D [-Winaccessible-base]
class F : public E, public D { };
                    ^~~~~~~~
p103a.cpp:38:4: warning: unused variable 'dp' [-Wunused-variable]
D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
   ^
p103a.cpp:40:4: warning: unused variable 'ep1' [-Wunused-variable]
E* ep1 = dynamic_cast<E*>(ap); // succeeds
   ^
6 warnings generated.
C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103a.cpp

$ g++-8 p103a.cpp -std=c++03  -Wall
p103a.cpp: In function 'void N::foo(N::D*)':
p103a.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
 B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
    ^~
p103a.cpp: In function 'void g()':
p103a.cpp:27:4: warning: unused variable 'dr' [-Wunused-variable]
 D& dr = dynamic_cast<D&>(*bp); // fails
    ^~
p103a.cpp: At global scope:
p103a.cpp:33:7: warning: direct base 'B' inaccessible in 'E' due to ambiguity
 class E : public D, public B { };
       ^
p103a.cpp:34:7: warning: direct base 'D' inaccessible in 'F' due to ambiguity
 class F : public E, public D { };
       ^
p103a.cpp: In function 'void h()':
p103a.cpp:38:4: warning: unused variable 'dp' [-Wunused-variable]
 D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
    ^~
p103a.cpp:40:4: warning: unused variable 'ep1' [-Wunused-variable]
 E* ep1 = dynamic_cast<E*>(ap); // succeeds
    ^~~
C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103a.cpp

$ g++-8 p103a.cpp -std=c++2a  -Wall
p103a.cpp: In function 'void N::foo(N::D*)':
p103a.cpp:16:4: warning: unused variable 'bp' [-Wunused-variable]
 B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
    ^~
p103a.cpp: In function 'void g()':
p103a.cpp:27:4: warning: unused variable 'dr' [-Wunused-variable]
 D& dr = dynamic_cast<D&>(*bp); // fails
    ^~
p103a.cpp: At global scope:
p103a.cpp:33:7: warning: direct base 'B' inaccessible in 'E' due to ambiguity
 class E : public D, public B { };
       ^
p103a.cpp:34:7: warning: direct base 'D' inaccessible in 'F' due to ambiguity
 class F : public E, public D { };
       ^
p103a.cpp: In function 'void h()':
p103a.cpp:38:4: warning: unused variable 'dp' [-Wunused-variable]
 D* dp = dynamic_cast<D*>(ap); // fails: yields null; f has two D subobjects
    ^~
p103a.cpp:40:4: warning: unused variable 'ep1' [-Wunused-variable]
 E* ep1 = dynamic_cast<E*>(ap); // succeeds
    ^~~
C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103a.cpp
```
###Visual Studio 2017 
cl *.cpp /EHsc /std:c++17

```
>cl p103a.cpp /EHsc /std:c++17
C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103.cpp
p103a.cpp(33): warning C4584: 'E': 基底クラス 'B' は既に 'D' の基底クラスです。
p103a.cpp(21): note: 'B' の宣言を確認してください
p103a.cpp(22): note: 'D' の宣言を確認してください
p103a.cpp(34): warning C4584: 'F': 基底クラス 'D' は既に 'E' の基底クラスです。
p103a.cpp(22): note: 'D' の宣言を確認してください
p103a.cpp(33): note: 'E' の宣言を確認してください
Microsoft (R) Incremental Linker Version 14.15.26726.0
Copyright (C) Microsoft Corporation.  All rights reserved.
/out:p103a.exe
p103a.obj

>p103a
C++N4741(48)8.5.1.7 Dynamic cast[expr.dynamic.cast]p.103.cpp
```

#検討事項(agenda) coding C++N4741
役に立つまたは意味のあるその他の出力

意味のある警告の取り方


#参考資料(reference)

docker gnu(gcc/g++) and llvm(clang/clang++)
https://qiita.com/drafts/059874ea39c4de64c0f7

[C][C++]の国際規格案の例題をコンパイルするときの課題７つ。
https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de

C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1


コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

C++2003とC++2017でコンパイルエラーになるならない事例集
https://qiita.com/kaizen_nagoya/items/a13ea3823441c430edff

Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

cpprefjpのdecltypeをコンパイル試験
https://qiita.com/kaizen_nagoya/items/090909af702f0d5d8a67

MISRA C++ 5-0-16
https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74

C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp
https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed

ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

C言語（C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

'wchar.h' file not found で困った clang++ macOS
https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11

Open POSIX Test Suiteの使い方を調べはじめました
https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C まとめ #include <misra_c.h>
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

「C++完全理解ガイド」の同意できること上位10
https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671

# 文書履歴(document history)
ver. 0.10 初稿 20180515
ver. 0.20 Visual Studio 2017追記 20180917 

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.