当我使用 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() 和对函数的右值引用?如果是这样,它们的含义是什么? 像这样通过引用传递函数可以吗?编译 '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) ]
最佳答案
为什么 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;
}
关于c++ - 模板函数类型推导和运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716318/