【发布时间】:2013-02-05 20:29:19
【问题描述】:
当我使用 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) ]
【问题讨论】:
-
你能提供你的c++编译器的版本吗?
-
MSVC++2012 与 NOV CTP 更新,gcc 4.5.3 和 4.7.2 测试,clang 3.0 和 3.1 测试。
-
我没有 VC11,所以我很难调查,但它闻起来像 URef 崩溃的错误。编译器错误地将其解释为 RRef 以运行并且不接受输入中的左值。检查
typedef void (* test)(); test g() { return f; } ... A() << g();是否有效会很有趣 -
函数指针确实有效,我已经检查过了,在执行 时使用 &f 而不是 f
-
好的,我提交了bug report
标签: c++ c++11 visual-c++ reference template-argument-deduction