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

时间:2013-02-05 20:29:19

标签: c++ c++11 visual-c++ reference template-deduction

当我使用 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,“确定”和“错误”行完全相同,类型 T 推断为 void(&amp; )()即可。或者 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) ]

2 个答案:

答案 0 :(得分:4)

为什么void operator<<(T&& x)void operator<<(T& x)符合目的。

可以在重载函数中使用x()调用函数,如下所示

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

};
void f()
{
}

int main()
{
    A().operator<<( f );
    A() << f;             
    return 0;
}

答案 1 :(得分:3)

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

提供的代码是有效的,同时允许对函数进行rvalue引用(它们与左值引用相同),这里在模板推导期间,T应该变为void(&amp;)()。

MSVC中的bug会阻止我的代码编译。

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