模板函数类型推导和运算符<<

dsi*_*dsi 14 c++ reference visual-c++ c++11 template-argument-deduction

当我用MSVC++编译以下代码时,我收到一个错误:

struct A
{
    template<typename T>
    void operator<<(T&& x)
    {
    }

};
void f()
{
}
int main()
{
    A().operator<<( f );  // ok
    A() << f;             // error

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g ++clang都编译好这段代码.AFAIK,' ok '和' error '行完全相同,并且类型T被推导为void(&)().或者是void()和允许对函数的右值引用?如果是这样,他们的意思是什么?这样通过引用传递函数是否可以?它是否无法编译' 错误 '行的MSVC++错误?BTW,错误输出:

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) ]
Run Code Online (Sandbox Code Playgroud)

dsi*_*dsi 3

所以,回答我自己的问题:

提供的代码是有效的,虽然允许对函数的右值引用(它们的作用与左值引用相同),但在模板推导过程中,T 应该变为 void(&)()。

MSVC 中的一个错误导致我的代码无法编译。

更新:该错误已在 Visual Studio 2013 编译器中修复