Không có ý nghĩa gì khi tự hỏi liệu có *&++i
có UB không. Hội nghị không nhất thiết truy cập vào giá trị được lưu trữ (trước hoặc mới) của i
, như bạn có thể thấy bằng cách sử dụng biểu thức khởi tạo này để tham chiếu. Chỉ khi một chuyển đổi rvalue là có liên quan (sử dụng trong bối cảnh đó) là có bất kỳ câu hỏi để thảo luận ở tất cả. Và sau đó, vì chúng tôi có thể sử dụng giá trị của ++i
, chúng tôi có thể sử dụng giá trị *&++i
với chính xác các lời nhắc tương tự như đối với ++i
.
Câu hỏi ban đầu có liên quan về cơ bản là i = ++i
, tương tự như i = *&++i
. Đó là hành vi không xác định trong C++ 03, do i
được sửa đổi hai lần giữa các điểm chuỗi và được xác định rõ trong C++ 11, do các tác dụng phụ của toán tử gán được sắp xếp sau khi tính toán giá trị của bên trái và bên tay phải. Có lẽ có liên quan cần lưu ý rằng các tiêu chuẩn phi quy định ví dụ trong tiêu chuẩn C++ 98 và C++ 03, không chính xác, mô tả một số trường hợp Hành vi không xác định chính thức chỉ là hành vi không xác định. Vì vậy, ý định không hoàn toàn rõ ràng, tất cả các con đường trở lại.Một nguyên tắc nhỏ là chỉ đơn giản là không dựa vào các trường hợp góc tối nghĩa của ngôn ngữ đó, để tránh chúng: người ta không cần phải là luật sư ngôn ngữ để hiểu mã & hellip;
Nguồn
2015-02-11 22:36:35
Trong câu trả lời đó, các ý kiến rất hiểu biết "Johannes Schaub - litb" mà ông cho rằng đó là một tuyên bố không đúng sự thật. Và không có phản ứng. –
@DrewDormann James Kanze cũng rất am hiểu –
'* & i' sẽ hoàn toàn hợp lệ và' + + i' trả về tham chiếu đến 'i' vì vậy tôi không thấy vấn đề ... –