我正在尝试使用 c++11 功能实现 boost::optional 之类的数据结构。这是我到目前为止所拥有的:
template<typename T>
struct maybe {
bool valid;
union {
T value;
};
maybe() : valid(false) {}
maybe(const T& _v) {
valid = true;
new (&value) T(_v);
}
maybe(const maybe& other) {
if (other.valid) {
valid = true;
new (&value) T(other.value);
}
else valid = false;
}
~maybe() {
if (valid)
value.~T();
}
bool is_valid() { return valid; }
operator T&() {
if (valid) return value;
throw std::bad_exception();
}
};
我利用不受限制的联合功能为可以就地存储的可选值创建正确对齐的空间,而不是动态分配空间。事情大部分都有效,除非我想创建一个带有引用的可能<>。例如maybe<int&>
导致 g++ 4.7 抱怨:
error: ‘maybe<int&>::<anonymous union>::value’ may not have reference type ‘int&’
because it is a member of a union
我应该怎么做才能使可能的类存储引用?也欢迎对课程提出任何其他改进/建议。