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

时间:2014-01-23 15:00:12

标签: c++ c++11

我无法弄清楚为什么这不起作用:

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。

1 个答案:

答案 0 :(得分:4)

实际上,它编译得很好in GCC 4.8in GCC 4.7in GCC 4.6in clang trunk r198621 (pre-3.5)以及Visual Studio 2012中。

如果#5没有在MSVS2010中编译,那么它就是错误的(对于该工具链中的C ++ 11功能来说并不罕见)。

请注意,您被告知#6您声明了一个函数而不是一个对象。也许,那么,你的第二个错误是在一些后来的代码中没有意识到你陷入了Most Vexing Parse(尽管你没有向我们展示任何这样的代码)。