C++ 20 中的可选赋值 constexpr 如何?
How is optional assignment constexpr in C++ 20?
对于optional的内部内容,optional不需要placement new来重构内部的in place storage或union吗?是否有一些新功能,如 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)
To the internal content of an optional, doesn't the optional require placement new in order to reconstruct the internal in place storage or union?
对于作业,是的。
但是虽然我们仍然无法在 constexpr 时间内执行 actual placement new,但我们确实找到了一个解决方法来解决它的缺失:std::construct_at
(from 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;
}
};
对于optional的内部内容,optional不需要placement new来重构内部的in place storage或union吗?是否有一些新功能,如 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)
To the internal content of an optional, doesn't the optional require placement new in order to reconstruct the internal in place storage or union?
对于作业,是的。
但是虽然我们仍然无法在 constexpr 时间内执行 actual placement new,但我们确实找到了一个解决方法来解决它的缺失:std::construct_at
(from 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;
}
};