当我使用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) ]