首页 > 解决方案 > 在这种情况下,T 型的要求是什么?

问题描述

给定以下功能:

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=and吗? Constructor missing parameterscopy c'tor

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

标签: c++11stdvector

解决方案


cppreference

void push_back( const T& value ); (1)
void push_back( T&& value ); (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只与Tvia相关f

请注意,这很可能是未定义的行为,因为您刚刚递增start直到它等于end. 尝试对map_reduce容器中的所有内容进行操作的人会将不可取消引用的迭代器作为end.

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


推荐阅读