我不知道为什么这不起作用:
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不编译?
对于(5),我得到此错误:
error C2664: 'POP::POP<void(void)>(T (__cdecl &&))' : cannot convert parameter 1 from 'void (__cdecl *)(void)' to 'void (__cdecl &&)(void)'
对于(6),我得到了此错误:
'POP pp(std::tr1::function<_Fty>)': prototyped function not called (was a variable definition intended?)
使用VS2010。
实际上,它在GCC 4.8,GCC 4.7,GCC 4.6,Clang Trunk R198621(PRE-3.5)和Visual Studio 2012中的编译中恰好编译。
。如果#5在MSVS2010中没有编译,则它是错误的(对于该工具链中的C 11个功能根本不寻常)。
请注意,您被警告#6您声明了功能而不是对象。也许,您的第二个错误是在以后的一些代码中,这些错误没有意识到您属于最烦人的解析(尽管您没有向我们展示任何这样的代码)。