14

当我使用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()和右值引用?如果是这样,它们的含义是什么?像这样通过引用传递函数可以吗?是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) ]
4

2 回答 2

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;
}
于 2013-02-18T19:50:10.837 回答
3

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

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

MSVC 中的一个错误阻止了我的代码编译。

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

于 2013-02-21T17:44:29.357 回答