当我使用 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) ]
答案 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编译器中修复