2014-11-12 11 views
5

Với Boost tôi có thể tạo ra một tùy chọn tại chỗ với: Làm thế nào để giải phóng std :: thử nghiệm :: tùy chọn?

boost::optional<boost::asio::io_service::work> work = boost::in_place(boost::ref(io_service)); 

Và buông tha nó với:

work = boost::none; 

Với C++ 14/hỗ trợ thực nghiệm, tôi thay vì có thể xây dựng một tùy chọn trong -place với:

std::experimental::optional<boost::asio::io_service::work> work; 
work.emplace(boost::asio::io_service::work(io_service)); 

Nhưng tôi đang ở một mất mát cho làm thế nào để buông tha nó ...

Trả lời

9
work = std::experimental::nullopt; 

nên buông tha work.
Các library fundamental TS quy định cụ thể trong [optional.nullopt]:

The struct nullopt_t is an empty structure type used as a unique type to indicate a disengaged state for optional objects.

Có một toán tử gán thích hợp, [optional.object.assign]:

optional<T>& operator=(nullopt_t) noexcept; 

Effects: If *this is engaged calls val->T::~T() to destroy the contained value; otherwise no effect.

Để tránh xây dựng một đối tượng nullopt_t mọi thời gian, hằng số thuộc loại này đã được khai báo:

struct nullopt_t{see below};
constexpr nullopt_t nullopt(unspecified);

+0

Trong mọi trường hợp, cách duy nhất (ish) bạn có thể tạo đối tượng kiểu 'nullopt_t' là bằng cách sao chép' nullopt'. –

+0

@LucDanton ... hoặc sao chép một đối tượng kiểu 'nullopt_t' được khởi tạo bằng cách sao chép' nullopt'. – Columbo

+0

Và như vậy, cuối cùng, tất cả đều đi xuống 'nullopt'. –

1

Sau khi đọc qua các tiêu đề, cách chính xác để buông tha các std :: nghiệm :: xuất hiện tùy chọn là:

work = std::experimental::nullopt; 
3

Cách đơn giản nhất để loại bỏ tùy chọn này là với foo = {};, được giải quyết như chuyển nhượng di chuyển từ số tiền thưởng được giải phóng optional. Đặc điểm kỹ thuật thực sự đi trên con đường của nó để cho phép cú pháp này mà nếu không sẽ được mơ hồ với nhiệm vụ từ các loại có chứa. (Xem [optional.object.assign] para 18-23 in N4023 for details)

+2

Hmm, với ví dụ của tôi mà ném lỗi trình biên dịch: lỗi: sử dụng chức năng đã xóa 'std :: experiment :: optional & std :: experiment :: optional :: operator = (std :: thử nghiệm :: tùy chọn &&) ' – Riot

Các vấn đề liên quan