在这种情况下,对T型有哪些要求?

时间:2018-07-11 16:08:24

标签: c++11 stdvector

提供以下功能:

template<class T, typename Iterator, typename Function >
T map_reduce(Iterator start, Iterator end, Function f) {
   std::Vector<T> vec;
   for(; start != end; ++start){
     vec.push_back(f(*start)); 
   }
   return *start;
}

有人可以向我解释为什么在这种情况下Toperator=Constructor missing parameters类型copy c'tor必须吗?

我认为T必须copy c'tor,因为该函数按值返回它。但是我不知道为什么T也必须constructor missing parametersoperator=

1 个答案:

答案 0 :(得分:0)

来自cppreference

void push_back( const T& value ); (1)
void push_back( T&& value ); (2)
     

类型要求

     
      
  • T必须满足CopyInsertable的要求才能使用重载(1)。
  •   
  • T必须满足MoveInsertable的要求才能使用重载(2)。
  •   

要选择哪种类型取决于f的类型。假设f返回一个左值引用,该引用与(1)匹配,因为这是限制性更强的引用。

这需要,给定

std::allocator<T> m;
T* p;

表达式

std::allocator_traits<std::allocator<T>>::construct(m, p, f(*start));

要格式正确。在这种情况下,该注释有助于告知我们

::new((void*)p) T(f(*start))

当您T时,您也(复制?)在返回值中构造一个return *start;。这可能是“构造函数缺少参数”错误的根源,因为我希望*start仅通过Tf相关。

请注意,这很有可能是不确定的行为,因为您刚刚增加了start直到等于end。尝试map_reduce容器中所有内容的人将通过不可引用的迭代器,称为end

至于丢失的operator=,谁知道呢?您尚未为实例化此错误所涉及的类型提供任何上下文。

相关问题