Goldがこれについて警告しない理由は、Goldがシンボルの不一致(複数のオブジェクトファイルで互換性のない方法で定義されている同じシンボル)のみを検出し、例ではそのような不一致がないためです。
ただし、Valgrindで例を実行すると、このエラーが発生します。
valgrind --track-origins=yes ./a.out
==11004== Memcheck, a memory error detector
==11004== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==11004== Using Valgrind-3.8.0.SVN and LibVEX; rerun with -h for copyright info
==11004== Command: ./a.out
==11004==
==11004== Conditional jump or move depends on uninitialised value(s)
==11004== at 0x40B6D24: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib64/libstdc++.so.6.0.16)
==11004== by 0x40B703C: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib64/libstdc++.so.6.0.16)
==11004== by 0x40C26DE: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib64/libstdc++.so.6.0.16)
==11004== by 0x40094F: A<int>::f() (a.h:6)
==11004== by 0x4008CB: f(A<int>*) (a.cpp:3)
==11004== by 0x400977: main (main.cpp:7)
==11004== Uninitialised value was created by a stack allocation
==11004== at 0x400964: main (main.cpp:5)
AddressSanitizerからさらに良いレポートを入手する必要があります。
アップデート:
重要なのは、実行中ではなく、リンク時にエラーを検出したいということです。
私はあなたの主張を理解していますが、現在、コンパイラ(他の変換ユニットに関する情報がない)またはリンカ(関連する型に関する情報がない)のいずれかがこれについて警告することはできません。
さて、デバッグビルドの場合、リンカーは理論的にはこれを行うことができます。すべての関数について、パラメータータイプのデバッグ情報も比較した場合です。bugzillaでゴールドの機能リクエストを提出することをお勧めします。