我无法弄清楚为什么这不起作用:
template<class T> void makeNew(T&& func)
{
function<void()> p = forward<T>(func);
}
class POP
{
private:
function<void()> fu;
public:
template<typename T> POP(T&& func) : fu(forward<T>(func)) {}
};
void Test(){}
现在代码:
makeNew(Test); //compiles (1)
makeNew(&Test); //compiles (2)
makeNew(function<void()>(Test)); //compiles (3)
POP pop(&Test); //compiles (4)
POP popp(Test); //doesn't compile (5)
POP pp(function<void()>(Test)); //doesn't compile (6)
为什么1,3编译和5,6不编译?
for(5)我收到此错误:
error C2664: 'POP::POP<void(void)>(T (__cdecl &&))' : cannot convert parameter 1 from 'void (__cdecl *)(void)' to 'void (__cdecl &&)(void)'
for(6)我收到此错误:
'POP pp(std::tr1::function<_Fty>)': prototyped function not called (was a variable definition intended?)
使用VS2010。
答案 0 :(得分:4)
实际上,它编译得很好in GCC 4.8,in GCC 4.7,in GCC 4.6,in clang trunk r198621 (pre-3.5)以及Visual Studio 2012中。
如果#5没有在MSVS2010中编译,那么它就是错误的(对于该工具链中的C ++ 11功能来说并不罕见)。
请注意,您被告知#6您声明了一个函数而不是一个对象。也许,那么,你的第二个错误是在一些后来的代码中没有意识到你陷入了Most Vexing Parse(尽管你没有向我们展示任何这样的代码)。