删除 std::future 和 std::p romise 的空白专用化
Removing the void specializations for std::future and std::promise
关于描述删除std::future和std::p romise P0241R0的空白专业的论文。 这可能是一个愚蠢的问题,但提出的解决方案是完全消除空专用化,但是当人们想要实例化std::future<void>
对象时,他们应该做什么呢?
如参考中所述,如果void
是常规类型,这是可能的。
void get_value() {
void x;
return x;
}
这是它在其他一些语言中的工作方式,所以它并非没有先例。 在其他语言中,它被称为"单位"类型,因为它只有一个可能的值。 (其他语言也有"null"类型,它没有可能的值,所以如果你尝试创建一个,你会得到一个错误。 它被命名为"null",但它与 null 指针无关。
在修改
了实现 TS 之后,如果实现对 enable_if 做了一些聪明的事情,似乎可以避免专门针对 void,例如
template <class R>
R future<R>::get()
{
return shared().get();
}
template <class R>
class shared_state {
...
R get()
{
wait();
if constexpr (!std::is_same_v<V, void>) {
return *_value;
}
}
template <typename V = value_t, std::enable_if_t<!std::is_same_v<V, void>, V>* = nullptr>
void set_value(const V& value)
{
...
}
template <typename V = value_t, std::enable_if_t<std::is_same_v<V, void>, V>* = nullptr>
void set_value()
{
...
}
}
std::future 的目的是知道没有实际值返回的进程何时结束。所以基本上它是一个同步工具。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- 删除 std::future 和 std::p romise 的空白专用化
- std :: getline从iStream中直至字符串[]多次空白
- std::stringstream中的空白插入失败
- 为什么从文件输入中读取 std::string 会返回空白
- 修剪std::string中的内部空白
- 查找std::string中非空白的第一个字符