当第二个参数是左值时,当前代码将无法编译,因为T&&结果会是X&which 意味着T需要是X&,这反过来意味着std::vector<T>将成为std::vector<X&>与第一个参数不匹配的std::vector<X> &. 因此,这是一个错误。
我会使用两个模板参数:
template<typename T, typename V>
void doVector(vector<T> & v, V && value)
{
v.emplace_back(std::forward<V>(value));
}
由于V可以使用不同的类型T,所以更有emplace_back意义,因为它不仅解决了问题,而且使代码更通用。:-)
现在进行下一个改进:由于我们使用emplace_backwhichT从参数创建类型的对象value(可能使用构造函数),我们可以利用这一事实,并使其成为可变参数函数:
template<typename T, typename ...V>
void doVector(vector<T> & v, V && ... value)
{
v.emplace_back(std::forward<V>(value)...);
}
这更通用,因为您可以将其用作:
struct point
{
point(int, int) {}
};
std::vector<point> pts;
doVector(pts, 1, 2);
std::vector<int> ints;
doVector(ints, 10);
希望有帮助。