これは、デフォルトの引数の控除/置換を含むテスト ケースに関するものです。テスト ケースは次のように要約できます。
template <class T, class = typename T::I>h(T){}
template <class T, class = typename T::I>j(T){}
class A
{
typedef int I;
friend void h<A>(A);
};
int main()
{
A a;
h(a);
j(a);
}
gcc-4.8.1 は関数 j に対してエラーをスローします。これは、関数 j がフレンドとして宣言されておらず、クラス A に対してプライベートでもなく、プライベート メンバー I (有効な) のアクセス規則に違反しているためです。関数 h はクラス A のフレンドとして宣言されており、プライベート メンバー I にアクセスできるため、gcc は関数 h に対してエラーをスローしません。
Clang は両方の関数でエラーをスローします。関数 j のエラー (宣言されていないフレンドは有効であり、期待どおり) ですが、フレンド関数 h に対してもエラーがスローされます (エラー: 私はクラス A のプライベート メンバーであるため、デフォルトの引数の推定に失敗しました)。これは、フレンド機能のアクセシビリティに違反しています。
コードパスを確認しました。clang はデフォルトの引数を推測できますが、置換を行う前にアクセス ルールをチェックし、エラーが発生します。これをどのように修正する必要があるかについて、誰かがガイダンスを提供できますか?