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
T
khi và chỉ khi khai báoT t=e;
được định dạng tốt, đối với một số biến tạm thời được phát minht
(§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ệne
xuất hiện trong một bối cảnh như vậy được cho là theo ngữ cảnh chuyển đếnbool
và nổi hình thành khi và chỉ khi tờ khaibool 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
&&
và||
(§5.14 [expr.log.and/or] p1
cho 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.
operator bool
. Ví dụ: nếu tôi có một shared_ptr
thà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.