c++11 - 在这种情况下,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;
}
有人可以解释一下为什么在这种情况下类型必须T
是operator=
and吗? Constructor missing parameters
copy c'tor
我认为这T
必须copy c'tor
是因为函数按值返回它。但我不知道为什么T
还必须constructor missing parameters
和operator=
.
解决方案
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
via相关f
。
请注意,这很可能是未定义的行为,因为您刚刚递增start
直到它等于end
. 尝试对map_reduce
容器中的所有内容进行操作的人会将不可取消引用的迭代器作为end
.
至于失踪operator=
,谁知道呢?您没有为该错误的实例化所涉及的类型提供任何上下文。
推荐阅读
- python-3.x - 具有矩阵类型输入的python混合整数线性规划
- php - 服务器端未正确读取授权承载
- javascript - 如何使用 CryptoJS 在 C# 中加密 AES
- javascript - 如何使用 fs 和批量请求读取多个 json 文件
- node.js - Nodejs 中的 Azure Bot Framework 网络聊天:将文本转换为语音时无法识别提示
- java - 生命周期配置未涵盖插件执行:org.bsc.maven:maven-processor-plugin:3.3.3:process
- swift - 有没有办法检测发布者何时有新订阅者?| 迅捷,结合
- azure - Azure OPDG 系统聚合日志到 KQL 中的 TimeChart
- javascript - 使用 Javascript Sourcemaps 减少 Application Insights 日志中的调用堆栈
- reactjs - 如何将 React 作为 NPM 包添加到 Apostrophe v3?