Là thành ngữ an toàn bool đã lỗi thời trong C ++ 11?


179

Câu trả lời này của @R. Martinho Fernandes cho thấy, thành ngữ bool-safe bị phản đối rõ ràng trong C ++ 11, vì nó có thể được thay thế bằng một đơn giản

explicit operator bool() const;

theo trích dẫn tiêu chuẩn trong câu trả lời §4 [conv] p3:

Một biểu thức e có thể được chuyển đổi hoàn toàn thành một loại Tkhi và chỉ khi khai báo T t=e;được định dạng tốt, đối với một số biến tạm thời được phát minh t(§8.5). Các cấu trúc ngôn ngữ nhất định yêu cầu một biểu thức được chuyển đổi thành giá trị Boolean. Một biểu hiện exuất hiện trong một bối cảnh như vậy được cho là theo ngữ cảnh chuyển đến boolnổi hình thành khi và chỉ khi tờ khai bool t(e);được tốt được hình thành , đối với một số biến t tạm thời phát minh (§8.5).

Phần được tô sáng hiển thị rõ ràng "diễn viên rõ ràng ẩn" (được gọi là "chuyển đổi theo ngữ cảnh" trong tiêu chuẩn) là @R. Martinho đặt nó.

"Cấu trúc ngôn ngữ nhất định" yêu cầu "diễn viên rõ ràng ẩn" dường như là như sau:

  • if, while, for( §6.4 [stmt.select] p4)
  • toán tử logic nhị phân &&||( §5.14 [expr.log.and/or] p1cho cả hai)
  • toán tử phủ định logic !( §5.3.1 [expr.unary.op] p9)
  • toán tử điều kiện ?:( §5.14 [expr.cond] p1)
  • static_assert( §7 [dcl.dcl] p4)
  • noexcept( §15.4 [except.spec] p2)

Là giả định của chúng tôi trong tiêu đề chính xác? Tôi hy vọng chúng tôi đã không bỏ qua bất kỳ nhược điểm tiềm năng.


30
+1: Tôi thích loại câu hỏi này dạy cho tôi những điều mới về tiêu chuẩn sắp tới.
Bjorn Pollex

1
Bạn biết những gì diễn viên rõ ràng thiếu trong tiêu chuẩn ... trả lại một cái gì đó từ người khác operator bool. Ví dụ: nếu tôi có một shared_ptrthành viên được gọi là p và có phương thức này: operator bool() const { return p; }thì nó không thể biên dịch. Đó là IMO ngu ngốc.
David

Bạn có ý nghĩa gì bởi dàn diễn viên "ngầm rõ ràng", @David?
Sz.

Câu trả lời:


128

Đúng. Đây là những ví dụ cho vấn đề với chỉ có ngầm chuyển đổi người dùng định nghĩa và các nhà khai thác chuyển đổi người dùng định nghĩa rõ ràng trên thực tế đã phát minh ra vì vấn đề này và thay thế tất cả những thứ an toàn-bool với một cái gì đó rất nhiều bụi và hợp lý hơn.


-5

Tôi sẽ không gọi nó là "lỗi thời". Không phải ai cũng có bước nhảy vọt lên C ++ 11 (thậm chí chưa tròn 1 tuổi). Và ngay cả khi một số lượng lớn các lập trình viên, khả năng giữ mã tương thích ngược sẽ là điều bắt buộc, vì loại thành ngữ này có vẻ hợp lý hơn đối với các thư viện so với các chương trình phù hợp.


34
Tôi đã hoàn toàn nói chuyện với sự có mặt của C ++ 11. Câu hỏi này không chạm vào mã cũ, khả năng tương thích ngược hoặc không sẵn sàng thay đổi thành trình biên dịch nhận biết C ++ 11. Cũng lưu ý rằng bản thân C ++ 11 không hoàn toàn tương thích ngược, nó đã giới thiệu những thay đổi đột phá.
Xèo

4
Xin lỗi, không thể biết điều đó, xin lỗi. Tôi đã không chỉ xem xét câu trả lời được liên kết ngay từ đầu, nhưng thực tế là câu hỏi được gắn thẻ [c ++] và [c ++ - faq], khiến tôi nghĩ rằng việc đánh giá cả hai giai đoạn của ngôn ngữ là có liên quan.
Luis Machuca

1
Mặc dù bạn chắc chắn đúng, tôi đã không nói rõ ràng trong câu hỏi. Tôi sẽ chỉnh sửa nó trong, cảm ơn vì đã ngẩng cao đầu.
Xèo

1
Câu trả lời này thực sự có thể sử dụng cập nhật, bây giờ đã gần hai tuổi.
Cún con

1
Tôi sẽ phải từ chối vì bất đồng, mặc dù tôi sẽ trực tiếp mua cho bạn một cốc bia và nói "hey không có cảm giác khó khăn". Nhưng nhiều mô hình trong C ++ 11 đã được triển khai khi --std=c++0xrất lâu trước khi chiếc đinh cuối cùng được đưa vào quan tài tiêu chuẩn và họ đã quyết định đặt tên cho thông số ISO. Trừ khi bạn là một người nghiện lập trình siêu mẫu thực sự sâu sắc, các chi tiết về thông số kỹ thuật C ++ 11 so với những gì mọi người đang sử dụng có thể không có kết quả đối với bạn ... điều đó có nghĩa là nó đã cũ hơn năm 2011 cho hầu hết các mục đích thực tế. Và bây giờ, bằng đồng hồ của tôi, đã gần năm 2015.
HostileFork nói rằng đừng tin vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.