c++ - 为什么没有 std::make_raw_storage_iterator?

标签 c++ templates

我想知道为什么 std::raw_storage_iterator 没有像 std::move_iterator 一样的 std::make_raw_storage_iterator >std::make_move_iteratorstd::raw_storage_iterator 类模板有两个模板参数。所以我认为为 std::raw_storage_iterator 提供一个 make 函数实际上比 std::move_iterator 更有用,后者只有一个模板参数要指定。

最佳答案

根据@dyps 的建议,一个明智的实现确实是可能的:

template <typename OutputIt>
auto make_raw_storage_iterator( OutputIt out ) {
    return std::raw_storage_iterator<OutputIt, std::remove_pointer_t<decltype(&*out)>>(out);
}

(Demo以cppreference为例)
这保证自 §20.7.10/1 起有效,它对 raw_storage_iterator 的模板参数提出了要求,要求:

OutputIterator is required to have its operator* return an object for which operator& is defined and returns a pointer to T [..]

其中T是第二个参数,输出范围的值类型。因此,鉴于底层输出迭代器,我们有足够的信息来确定 raw_storage_iterator 的预期特化。

这个没有被提议的原因肯定只是一个疏忽 - 考虑到 make_reverse_iterator 甚至 make_unique 在 C++14 之前也没有提供。随意迈出第一步。

关于c++ - 为什么没有 std::make_raw_storage_iterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30354113/

相关文章:

c++ - 无法使用 QML/C++ 中的绑定(bind)对象初始化 UI

c++ - std::min/std::max 只保证一次评估

php - 如何将 Varnish ESI 与模块化 PHP 模板系统一起使用

C++ 调用嵌套模板类析构函数

javascript - XML 格式错误 nunjucks 模板渲染

c++ - "DSO missing from command line"while cross compiling mosquitto example

c++ - 我可以专门研究前向声明的模板吗?

c++ - std::tr1::function 及其接受的模板值

javascript - 来自 HTML 元素的 underscore.js 模板

c++ - 在模板化构造函数中调用构造函数时的有趣行为