2014-11-15 19 views
7

Pre-C++ 11 chúng ta biết rằng đoản mạch và trật tự thẩm định được yêu cầu cho nhà điều hành && vì:Safe đánh giá ngắn mạch trong C++ 11

1.9.18

trong việc đánh giá các khái niệm sau

a && b 
a || b 
a ? b : c 
a , b 

sử dụng được xây dựng trong ý nghĩa của các toán tử trong các biểu thức này, có một điểm chuỗi sau khi đánh giá biểu thức đầu tiên (12).

Nhưng chuỗi điểm được không còn tồn tại trong C++ 11, như vậy mà là một phần tiêu chuẩn mà nói:

if (ptr && ptr->do_something()) 
{ 
} 

là an toàn?

+2

[expr.log.and]/2 – chris

+1

Điểm chuỗi không đảm bảo đoản mạch. (Rõ ràng 'toán tử,' không thể ngắn mạch.) Bạn vẫn cần thông số toán tử thực tế để đảm bảo điều đó. –

Trả lời

14

[expr.log.and]

Các && nhóm hành trái sang phải. Các toán hạng được chuyển đổi theo ngữ cảnh thành bool (Khoản 4). Kết quả là đúng nếu cả hai toán hạng đều đúng và sai. Không giống như &, && đảm bảo đánh giá từ trái sang phải : toán hạng thứ hai không được đánh giá nếu toán hạng đầu tiên là sai.

Kết quả là bool. Nếu biểu thức thứ hai được đánh giá, mọi tính toán giá trị và hiệu ứng phụ liên quan với biểu thức đầu tiên được sắp xếp theo trình tự trước mỗi lần tính toán giá trị và tác dụng phụ liên quan đến biểu thức thứ hai .

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