当我使用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都可以成功编译这段代码。据我所知,'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) ]
typedef void (* test)(); test g() { return f; } ... A() << g();
是否可行。 - Andy ProwlT
应该被推断为void (&)()
。 - aschepler