Mục đích chung là decay
là lấy một loại và sửa đổi nó để phù hợp để lưu trữ.
Hãy xem những ví dụ mà decay
làm cho công việc, trong khi remove_reference
sẽ không:
auto foo(std::string const& s) {
if (global_condition)
return make_optional(s);
else
return {};
}
hoặc
void function() { std::cout << "hello world!\n"; }
auto bar() { return std::make_optional(function); }
hoặc
int buff[15];
auto baz() { return std::make_optional(buff); }
Một optional<int[15]>
sẽ là một rất lạ thú - các mảng kiểu C không hoạt động tốt khi được xử lý như li terals, đó là những gì optional
thực hiện tham số T
.
Nếu bạn đang làm cho một bản sao của dữ liệu, const
hoặc volatile
bản chất của nguồn không quan trọng. Và bạn chỉ có thể tạo bản sao mảng và chức năng đơn giản bằng cách phân rã chúng thành con trỏ (không bị rơi trở lại trên std::array
hoặc tương tự). (Về mặt lý thuyết, công việc có thể được thực hiện để làm optional<int[15]>
làm việc, nhưng nó sẽ là rất nhiều biến chứng thêm)
Vì vậy std::decay
giải quyết tất cả những vấn đề này, và không thực sự gây ra vấn đề, miễn là bạn cho phép make_optional
để suy luận của mình loại đối số thay vì truyền T
theo nghĩa đen.
Nếu bạn muốn chuyển một số T
theo nghĩa đen, không có lý do gì để sử dụng make_optional
sau khi tất cả.
Bởi vì T có thể là một tài liệu tham khảo giá trị trái, và tài liệu tham khảo bắt buộc không được phép. – Simple
@ Đơn giản vậy tại sao không chỉ 'remove_reference'? – ecatmur
Có lẽ vì vậy bạn không thể tạo một 'tùy chọn' hoặc 'tùy chọn ', cũng sẽ có ngữ nghĩa kỳ lạ. –
Simple