完美的转发功能与完美的转发构造函数



我不知道为什么这不起作用:

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您声明了功能而不是对象。也许,您的第二个错误是在以后的一些代码中,这些错误没有意识到您属于最烦人的解析(尽管您没有向我们展示任何这样的代码)。

最新更新