template<class Value>
class Optional {
public:
+ typedef Value value_type;
+
static_assert(!std::is_reference<Value>::value,
"Optional may not be used with reference types");
static_assert(!std::is_abstract<Value>::value,
"Optional may not be used with abstract types");
- Optional()
+ Optional() noexcept
: hasValue_(false) {
}
}
}
- const Value& value() const {
+ const Value& value() const& {
require_value();
return value_;
}
- Value& value() {
+ Value& value() & {
require_value();
return value_;
}
- Value* get_pointer() { return hasValue_ ? &value_ : nullptr; }
- const Value* get_pointer() const { return hasValue_ ? &value_ : nullptr; }
+ Value value() && {
+ require_value();
+ return std::move(value_);
+ }
+
+ const Value* get_pointer() const& { return hasValue_ ? &value_ : nullptr; }
+ Value* get_pointer() & { return hasValue_ ? &value_ : nullptr; }
+ Value* get_pointer() && = delete;
bool hasValue() const { return hasValue_; }
return hasValue();
}
- const Value& operator*() const { return value(); }
- Value& operator*() { return value(); }
+ const Value& operator*() const& { return value(); }
+ Value& operator*() & { return value(); }
+ Value operator*() && { return std::move(value()); }
const Value* operator->() const { return &value(); }
Value* operator->() { return &value(); }