提供以下功能:
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;
}
有人可以向我解释为什么在这种情况下T
,operator=
和Constructor missing parameters
类型copy c'tor
必须吗?
我认为T
必须copy c'tor
,因为该函数按值返回它。但是我不知道为什么T
也必须constructor missing parameters
和operator=
。
答案 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
仅通过T
与f
相关。
请注意,这很有可能是不确定的行为,因为您刚刚增加了start
直到等于end
。尝试map_reduce
容器中所有内容的人将通过不可引用的迭代器,称为end
。
至于丢失的operator=
,谁知道呢?您尚未为实例化此错误所涉及的类型提供任何上下文。