【发布时间】:2015-08-25 13:08:54
【问题描述】:
为什么编译器无法推断出std::forward 的模板参数?
我的意思是:
#include <memory>
#include <iostream>
struct X{};
struct A{
A( const X& ) { std::cout << "cpy ctor\n"; }
A( X&& ) { std::cout << "move ctor\n"; }
};
X foo() { return {}; }
template<typename T,typename Arg>
T* factory( Arg&& a )
{
return new T(std::forward(a));
// ----------^^^^^^^^^^^^^^^ error: can't deduce template parameter
}
int main()
{
factory<A>(foo());
}
我知道这是一种设计选择(由于std::forward 的定义中的std::remove_reference)避免用户忘记指定类型。我无法得到的是:为什么它的实施方式可以防止扣除?为什么编译器不只是将forward 的模板参数推断为Arg。
【问题讨论】:
-
你能澄清一下这个问题吗?您是在问为什么选择该设计来防止推理推理,或者为什么它的实现方式可以防止推理?
-
手动指定类型的目的是让
forward可以决定是否应该movea。模板参数推导可以让您确定a的类型,但不能确定是否应该移动它。 -
@Angew 第二个。
标签: c++ c++11 perfect-forwarding