2012-02-21 38 views
7

Tôi đang nghĩ đến việc thay thế tất cả các trường hợp thành ngữ bool an toàn bằng explicit operator bool trong mã đã sử dụng các tính năng C++ 11 (vì vậy các trình biên dịch cũ không nhận ra chuyển đổi rõ ràng) các nhà khai thác sẽ không quan trọng), vì vậy tôi muốn biết nếu nó có thể gây ra một số vấn đề tinh tế.Sự không tương thích giữa thành ngữ bool an toàn và toán tử bool

Vì vậy, tất cả khả năng không tương thích nào (thậm chí là những điều ít nhất) có thể xảy ra do chuyển từ thành ngữ bool cũ sang mờ sang explicit operator bool mới và sáng bóng?

EDIT: Tôi biết rằng chuyển đổi là một ý tưởng tốt, vì sau này là một tính năng ngôn ngữ, được hiểu bởi trình biên dịch, vì vậy nó sẽ làm việc không tồi tệ hơn những gì trong thực tế chỉ là một hack. Tôi chỉ muốn biết những khác biệt có thể có.

Trả lời

3

Nếu bạn đã sử dụng chuyển đổi bool an toàn không chính xác trong mã của mình, chỉ sau đó explicit operator bool không tương thích, vì nó sẽ không cho phép bạn thực hiện những việc không chính xác một cách dễ dàng. Nếu không, nó sẽ là tốt mà không có bất kỳ vấn đề. Trong thực tế, ngay cả khi có vấn đề, bạn vẫn nên chuyển sang explicit operator bool, bởi vì nếu bạn làm như vậy, thì bạn có thể xác định vấn đề trong việc sử dụng chuyển đổi an toàn bool.

Theo this article, một số trình biên dịch phát ra hướng dẫn hiệu quả để thực hiện an toàn-bool sử dụng con trỏ hàm thành viên,

Khi mọi người bắt đầu sử dụng thành ngữ này, người ta phát hiện ra rằng có một hình phạt hiệu quả trên một số trình biên dịch - các con trỏ hàm thành viên gây ra một lỗi trình biên dịch dẫn đến việc thực hiện chậm hơn khi địa chỉ được tìm nạp. Mặc dù sự khác biệt là biên, nhưng thực tế hiện tại thường sử dụng một con trỏ dữ liệu thành viên thay vì một con trỏ hàm thành viên.

+0

Tất nhiên bạn đã đúng. Nhưng có một lý do tôi gắn thẻ này với 'language-lawyer'. Tôi muốn những sự thật thuần khiết theo sau bản thân tiêu chuẩn, không phải là lời khuyên về những thực hành tốt. Phải làm rõ điều đó, nhưng dù sao cũng được. – Fanael

+0

@ Fanael: Các tiêu chuẩn, C++ 03 và C++ 11 cả hai, không nói về thành ngữ an toàn-bool, vì vậy nó không thể trích dẫn từ nó để hỗ trợ những gì tôi đã nói. Tất cả những gì tôi ngụ ý là C++ 11 đã giới thiệu 'bool' toán tử rõ ràng vì lý do, và một trong những lý do, tôi nghĩ, là' toán tử bool' rõ ràng là ** an toàn hơn ** cái gọi là thành ngữ an toàn-bool. – Nawaz

+1

Nhưng các cuộc đàm phán tiêu chuẩn về những thứ được sử dụng để thực hiện thành ngữ bool an toàn. Vì vậy, trong khi tiêu chuẩn nói vô nghĩa về thành ngữ đó, chính xác của nó đảm bảo được khá nhiều ngụ ý bởi các tài liệu. – Fanael

4

Có lẽ sự khác biệt lớn nhất, giả sử mã của bạn không có lỗi (tôi biết, không phải giả định an toàn), trong một số trường hợp, bạn có thể muốn chuyển đổi ẩn thành chính xác bool. Chức năng chuyển đổi explicit sẽ không khớp.

struct S1 
{ 
    operator S1*() { return 0; } /* I know, not the best possible type */ 
} s1; 

struct S2 
{ 
    explicit operator bool() { return false; } 
} s2; 

void f() 
{ 
    bool b1 = s1; /* okay */ 
    bool b2 = s2; /* not okay */ 
} 
+2

Đó không phải là thành ngữ bool an toàn. – Nawaz

+4

Tôi đã lưu ý rằng loại con trỏ tôi đã sử dụng không phải là loại tốt nhất có thể, nó phục vụ tốt như một ví dụ vì sự khác biệt giữa điều này và triển khai chính xác không liên quan đến câu trả lời của tôi và điều này dễ đọc hơn. – hvd

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