And*_*joe 13 c++ constexpr option-type c++20
对于可选的内部内容,可选是否需要放置新的内容才能重建内部就地存储或联合?是否有一些新功能(例如 C++ 20 中的placement new)允许 std::Optional 的 constexpr 赋值?
template< class U = T >
optional& operator=( U&& value );
(since C++17)
(until C++20)
template< class U = T >
constexpr optional& operator=( U&& value );
(since C++20)
Run Code Online (Sandbox Code Playgroud)
Bar*_*rry 10
对于可选的内部内容,可选是否需要放置新的内容才能重建内部就地存储或联合?
对于作业来说,是的。
但是,虽然我们仍然无法在 constexpr 时间内进行实际的新放置,但我们确实找到了解决方法:(std::construct_at来自P0784)。这是一种非常有限的新安置形式,但足以让optional作业发挥作用。
另一个变化是我们还需要能够实际更改联合的活动成员 - 因为如果我们无法实际切换,那么我们是否可以构造新对象也无关紧要。这也发生在 C++20 ( P1330 ) 中。
将它们放在一起,您就得到了可选分配的功能实现:P2231。一个简短的实现如下所示:
template <typename T>
struct optional {
union {
T value;
char empty;
};
bool has_value;
constexpr optional& operator=(T const& rhs) {
if (has_value) {
value = rhs;
} else {
// basically ::new (&value) T(rhs);
// except blessed for constexpr usage
std::construct_at(&value, rhs);
}
has_value = true;
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |