删除 std::future 和 std::promise 的无效特化
Removing the void specializations for std::future and std::promise
关于描述删除 std::future 和 std::promise P0241R0 的无效特化的论文。这可能是一个愚蠢的问题,但建议的解决方案是完全删除 void 特化,但是当人们想要实例化一个 std::future<void>
对象时,他们期望做什么?
如参考文献中所述,这是可能的 if void
were a regular type。
void get_value() {
void x;
return x;
}
这是它在其他一些语言中的工作方式,因此并非没有先例。在其他语言中,它被称为 "unit" 类型,因为它只有一个可能的值。 (其他语言也有 "null" 类型,它没有可能的值,所以如果你尝试创建一个类型,你会得到一个错误。它被命名为 "null" 但它与空指针无关。)
std::future 的目的是了解对 return 没有实际价值的进程何时结束。所以基本上它是一个同步工具。
在对 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::promise P0241R0 的无效特化的论文。这可能是一个愚蠢的问题,但建议的解决方案是完全删除 void 特化,但是当人们想要实例化一个 std::future<void>
对象时,他们期望做什么?
如参考文献中所述,这是可能的 if void
were a regular type。
void get_value() {
void x;
return x;
}
这是它在其他一些语言中的工作方式,因此并非没有先例。在其他语言中,它被称为 "unit" 类型,因为它只有一个可能的值。 (其他语言也有 "null" 类型,它没有可能的值,所以如果你尝试创建一个类型,你会得到一个错误。它被命名为 "null" 但它与空指针无关。)
std::future 的目的是了解对 return 没有实际价值的进程何时结束。所以基本上它是一个同步工具。
在对 TS 的实现进行修补后,如果实现对 enable_if 做了一些聪明的事情,例如
,似乎可以避免专门针对 voidtemplate <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()
{
...
}
}