g(unsigned long)
Clang 3.0 は次のコードを拒否し、見つからないことを訴えます。GCC 4.8 はエラーなしでそれを受け入れます。
void g(int*);
void f()
{
g(sizeof(int) - sizeof(int)); // ok, evaluates to 0
}
template<typename T>
struct A
{
void f()
{
g(sizeof(T) - sizeof(T)); // error: no matching function
}
};
標準を読んだところ、「g」は従属名ではなく、clang のように検索してすぐにバインドする必要があることがわかりました。それでも、標準で指定された動作は間違っているように見えg
ます。そうでなければ、インスタンス化時に正しくバインドされるからです。
[temp.dep]
[...] 次の形式の式で は、postfix-expression が id-expression の場合、id-expression は、expression-list 内のいずれかの式が型である場合に依存する名前を示します
postfix-expression ( expression-list
。)
-dependent 式 (14.6.2.2)、または id-expression の unqualified-id が、テンプレート引数のいずれかがテンプレート パラメーターに依存する template-id である場合。演算子のオペランドが型依存式の場合、演算子は依存名も示します。このような名前はバインドされておらず、テンプレート定義のコンテキストとインスタンス化のポイントのコンテキストの両方で、テンプレートのインスタンス化のポイント (14.6.4.1) で検索されます。
このシナリオでの準拠動作は何ですか?