2014-11-11 16 views
12

Tại sao std::optional (std::experimental::optional trong libC++ vào lúc này) không có chuyên môn cho các loại tham chiếu (so với boost::optional)?std :: chuyên môn tùy chọn cho các loại tham chiếu

Tôi nghĩ rằng đó sẽ là lựa chọn rất hữu ích.

Có một số đối tượng với tham chiếu đến lẽ đã tồn tại đối tượng ngữ nghĩa trong STL?

+9

Cuối cùng tôi kết luận rằng tôi có thể sử dụng 'std :: tùy chọn >' cho mục đích của tôi. – Orient

Trả lời

7

Khi n3406 (bản sửa đổi số 2 của đề xuất) được thảo luận, một số thành viên ủy ban không thoải mái với các tham chiếu tùy chọn. Trong n3527 (bản sửa đổi số 3), các tác giả đã quyết định đưa ra các tham chiếu tùy chọn một đề xuất phụ, để tăng cơ hội nhận các giá trị tùy chọn được phê duyệt và đưa vào C++ 14. Mặc dù tùy chọn không hoàn toàn biến nó thành C++ 14 vì nhiều lý do khác nhau, ủy ban đã không từ chối các tham chiếu tùy chọn và được tự do thêm các tham chiếu tùy chọn trong tương lai nếu ai đó đề xuất nó.

0

Nếu tôi có thể đoán nguy cơ, đó là vì câu này trong đặc tả của tiêu chuẩn :: thử nghiệm :: tùy chọn. (Phần 5.2, p1)

Một chương trình mà đòi hỏi instantiation của mẫu optional cho một loại tài liệu tham khảo, hoặc cho thể loại cv-trình độ in_place_t hoặc nullopt_t là vô hình thành.

+2

Có lẽ nó là đúng, nhưng tôi không thể hiểu được nền tảng của kết luận được rút ra. – Orient

+0

@Orient đó là tiêu chuẩn cho "' tùy chọn' có thể không được sử dụng với tài liệu tham khảo và hai loại đặc biệt "- nói cách khác nó không được thiết kế để làm việc với chúng. Trong thực tế, câu hỏi của bạn là một phương tiện khác để nói "tại sao tiêu chuẩn chứa mệnh đề đó?" –

+1

@ArneMertz Bạn nói đúng, nhưng điều quan trọng là phải hiểu được ý định của cometee. – Orient

4

Có thực sự là cái gì đó có tham chiếu đến lẽ hiện tượng ngữ nghĩa. Nó được gọi là một con trỏ (const). Một con trỏ không sở hữu cũ. Có ba khác biệt giữa tham chiếu và con trỏ:

  1. Con trỏ có thể rỗng, tham chiếu không thể. Đây chính xác là sự khác biệt bạn muốn phá vỡ với std::optional.
  2. Con trỏ có thể được chuyển hướng đến điểm khác. Làm cho nó const, và sự khác biệt đó biến mất là tốt.
  3. Tài liệu tham khảo không cần bị hủy đăng ký bởi -> hoặc *. Đây là đường cú pháp thuần túy và có thể vì 1. Và cú pháp con trỏ (dereferencing và convertible to bool) là chính xác những gì std::optional cung cấp để truy cập vào giá trị và kiểm tra sự hiện diện của nó.

Cập nhật: optional là một container cho các giá trị. Giống như các vật chứa khác (ví dụ: vector), nó không phải là được thiết kế để chứa tham chiếu. Nếu bạn muốn tham chiếu tùy chọn, hãy sử dụng con trỏ hoặc nếu bạn thực sự cần một giao diện có cú pháp tương tự là std::optional, hãy tạo một trình bao bọc nhỏ (và tầm thường) cho con trỏ.

Cập nhật2: Đối với câu hỏi lý do tại sao không có chuyên môn như vậy: bởi vì ủy ban chỉ đơn giản đã chọn không tham gia. Lý do hợp lý có thể được tìm thấy ở đâu đó trong các giấy tờ. Nó có thể là bởi vì họ coi con trỏ là đủ.

+10

Tuy nhiên, đối với lập trình chung bạn muốn 'std :: optional ' wo hoạt động ngay cả khi 'T == U &'. Bạn giải thích khá rõ cách 'std :: optinal ' có thể được thực hiện với 'U * const' nhưng đó không thực sự là một trợ giúp trong lập trình chung. – MSalters

+2

@MSalters Tôi không hiểu tại sao bạn lại muốn điều đó. 'tùy chọn' là đúng đối với các giá trị. Xem cập nhật của tôi cho câu trả lời. "lập trình chung" không phải là một biện minh blanco để có bất cứ điều gì có thể tưởng tượng được. Nếu bạn tình cờ gặp một tình huống mà bạn muốn hỗ trợ các giá trị tùy chọn * và * tham chiếu tùy chọn, hãy sử dụng chuyên môn hóa cho distingusih giữa 'tùy chọn' và con trỏ hoặc lớp trình bao bọc mà tôi đề cập đến. –

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