我编写了一个自定义的可选类(因为我被迫使用没有STL的C++98)。 它看起来是这样的:
template <typename T>
struct optional {
char value[sizeof(T)];
bool has_value;
T& operator*() {
return *reinterpret_cast<T*>(value);
}
};
编译器产生警告取消引用类型双关语指针将打破严格的别名规则
。
我可以做什么使这个类没有UB? 也许应该使用memcpy
,但我不明白如何使用。
避免警告的一种方法是使用类型识别工具。 即:
...
union {
char empty;
T value;
} storage;
bool has_value;
...
// when object is set to value
new (&storage.value) T(/* arg *);
has_value = true;
...
T& operator() {
// check for has_value should be here
return storage.value;
...
~optiona() {
if (has_value) storage.value.~T();
...
这是可行的,因为当创建union时,第一个元素将被构造(空char)。 当您将value放入可选项中时,您将激活联合的第二个成员(value),并且自那时起可以很好地定义它来访问它。
我可以做什么使这个类没有UB?
可选
动态分配对象会容易得多。 慢一点,是的。 但更简单和标准的一致性。