次のコードをMSVC++でコンパイルすると、エラーが発生します。
struct A
{
template<typename T>
void operator<<(T&& x)
{
}
};
void f()
{
}
int main()
{
A().operator<<( f ); // ok
A() << f; // error
return 0;
}
g++とclangは両方とも、このコードを正常にコンパイルします。AFAIK、「ok」および「error」行はまったく同じことを行い、型Tはvoid(&)()に推定されます。それともvoid()であり、関数への右辺値参照は許可されていますか? もしそうなら、それらの意味は何ですか?そのように関数を参照渡ししても問題ありませんか? 「 error」行でコンパイルに失敗するのはMSVC++のバグですか?ところで、エラー出力:
no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion)
could be 'void A::operator <<<void(void)>(T (__cdecl &&))'
with[ T=void (void) ]