无法绑定转发参考

时间:2019-02-09 19:12:13

标签: c++

我有一个函数merge_and_sort

template<template<typename, typename...> typename Container1, template<typename, typename...> typename Container2, typename T, typename U, typename... Args1, typename... Args2>
auto merge_and_sort(Container1<T, Args1...>&& first, Container2<U, Args2...>&& second)
{
  std::remove_reference_t<Container1<std::common_type_t<T, U>>> result(first.size() + second.size());
  std::merge(first.begin(), first.end(), second.begin(), second.end(), result.begin());
  std::sort(result.begin(), result.end());
  return result;
}

但是,当我用merge_and_sort(foo, bar)进行调用时,其中foo是整数的向量,而bar是浮点数的向量(忽略结果类型始终为Container1的事实,应该是没有问题的),我明白了并报错:

Error C2664 'auto merge_and_sort<std::vector,std::vector,float,int,std::allocator<_Ty>,std::allocator<int>>(std::vector<_Ty,std::allocator<_Ty>> &&,std::vector<int,std::allocator<int>> &&)': cannot convert argument 1 from 'std::vector<float,std::allocator<_Ty>>' to 'std::vector<float,std::allocator<_Ty>> &&'   

有人可以指出我为什么会这样吗?另外,我不是在寻找替代方法来实现此目的,而是在寻找解决方案。当参数是左值引用时,代码可以正常工作。

1 个答案:

答案 0 :(得分:2)

您的参数ContainerN<T, ArgsN...>&&不是转发引用,而是实际的右值引用。

这基本上是定义,因为ContainerN<T, ArgsN...>不是模板参数:

  

转发引用是对不代表类模板的模板参数的cv不合格模板参数的右值引用(在类模板参数推导([over.match.class.deduct])期间)。

http://eel.is/c++draft/temp.deduct.call#3.sentence-3