Đặt tất cả các vấn đề bảo trì và đọc sang một bên, các dòng mã này có tạo ra hành vi không xác định không?Sử dụng toán tử bậc ba để khởi tạo biến tham chiếu?
float a = 0, b = 0;
float& x = some_condition()? a : b;
x = 5;
cout << a << ", " << b;
Đặt tất cả các vấn đề bảo trì và đọc sang một bên, các dòng mã này có tạo ra hành vi không xác định không?Sử dụng toán tử bậc ba để khởi tạo biến tham chiếu?
float a = 0, b = 0;
float& x = some_condition()? a : b;
x = 5;
cout << a << ", " << b;
Không, nó ổn. Nó sẽ không tạo ra hành vi không xác định trong mã này. Bạn sẽ chỉ thay đổi giá trị của a hoặc b thành 5, theo điều kiện.
này là hoàn toàn tốt, miễn là cả hai mặt của điều kiện là biểu thức có thể được sử dụng để khởi tạo một tài liệu tham khảo (ví dụ như các biến, dereferences con trỏ, vv)
float& x = some_condition()? a : *(&b); // This is OK - it is the same as your code
float& x = some_condition()? a : b+1; // This will not compile, because you cannot take reference of b+1
Vâng, không có khả năng biên dịch là một hành vi được xác định hoàn hảo, phải không? –
Có thể cho rằng, có - một chương trình bị hình thành không biểu hiện hành vi được xác định. – Puppy
Thất bại nhanh, thất bại sớm. –
có thể còn đơn giản hơn: '(some_condition()? a: b) = 5; ' – Slava