これにより、C ++標準に従って未定義の動作が発生しますか?
まあ、本当の問題は、これが未定義の振る舞いなのか、それとも(標準的な用語で)不正な形式として標準によって指定されているのかということです。明らかに、それは正しくないからです。私はこれについて標準から何かを見つけようとしましたが、役に立ちませんでした。ただし、多くの同様の状況、たとえば、decl / defの不一致や、リンカーでのファンキーなもののスロー(セクション3.5、7.5を参照、または「extern」または「linkage」の検索)では、標準は通常、次のようになります。
プログラムは形式が正しくなく、診断は必要ありません。
ですから、これがここでも当てはまると仮定するのはかなり安全だと思います。これは、これが誤ったコードであり、「未定義動作」よりも最悪であることを意味します。これは、UBが特定の実装に対して何らかの合理的な動作をすることが多いためです(ただし、その動作がどうなるかを推測するべきではなく、確かにそれに依存しないでください)。投機)。「不正な形式」という用語は、標準では非常に自由に使用されており、多かれ少なかれ、コードがFUBARであることを意味していると推測できます。これはまた、リンカがこの種のエラーをキャッチできるように実装する必要がないことを意味します。そのため、リンカは正しくコンパイルおよびリンクされますが、実行するときは靴下を保持します。 。
リンカーはこの種の型の不一致をキャッチできますか?
理論的には、そうです。リンカの実装では、変数の型を(名前を操作して)外部シンボルにエンコードできるため、型が一致するもの(たとえば、オーバーロードされた関数など)へのリンクを制限したり、次の場合に診断(エラー)をスローしたりできます。タイプの不一致が発生します。前者は標準に比べて寛容すぎると思います。
ただし、私が知っているすべてのコンパイラは変数の名前を壊すわけではないため、このような不一致は「形式が正しくなく、診断は不要」であると見なすことができます。