Tại sao các loại biểu thức thay đổi trong C ++ giữa các phiên bản?


13

Tôi cố gắng hiểu các loại biểu hiện của C ++ và càng đọc, tôi càng bối rối, vì tôi thấy bản nháp C ++ rất khó tiêu hóa và do đó thích các tài nguyên khác nhưng chúng mâu thuẫn với nhau hoặc không tính đến điều đó từ ngữ và định nghĩa giữa các phiên bản C ++ thay đổi rất nhiều.

Trong phần sau tôi đề cập đến các bản nháp sau:

  • C ++ 11 [ n3690 ] (bản thảo cuối cùng)
  • C ++ 17 [ n4659 ] (bản thảo cuối cùng)
  • C ++ 20 [ n4835 ] (dự thảo hiện tại)

C++11 3.10 Giá trị và giá trị

... Một giá trị (giá trị thuần túy rvalue) là một giá trị không phải là giá trị x. [Ví dụ: Kết quả của việc gọi một hàm có kiểu trả về không phải là tham chiếu là một giá trị. Giá trị của một nghĩa đen như 12, 7.3e5 hoặc true cũng là một giá trị. - ví dụ cuối]

C++17 3.10 Giá trị và giá trị

... Giá trị là một biểu thức có đánh giá khởi tạo một đối tượng hoặc trường bit hoặc tính giá trị của toán hạng của toán tử, như được chỉ định bởi bối cảnh xuất hiện.

C++20 7.2.1 Danh mục giá trị *

... Giá trị là một biểu thức có đánh giá khởi tạo một đối tượng hoặc trường bit hoặc tính giá trị của toán hạng của toán tử, như được chỉ định bởi ngữ cảnh xuất hiện hoặc biểu thức có loại cv void.

Tôi sẽ hiểu các thay đổi từ ngữ, và một số điều chỉnh được thực hiện, nhưng đối với tôi toàn bộ thay đổi định nghĩa. Ai đó có thể giúp tôi hiểu điều này? Chẳng hạn, tại sao câu bị loại bỏ rằng giá trị là một giá trị không phải là giá trị x? Hoặc tại sao ví dụ hữu ích đã được gỡ bỏ?


3
Tôi là tất cả để cấm các thẻ ngôn ngữ cụ thể phiên bản. Ngoại trừ chính xác loại câu hỏi này.
tò mò


" Không tính đến việc từ ngữ và định nghĩa giữa các phiên bản C ++ thay đổi nhiều. " Nhưng định nghĩa không thực sự thay đổi. Khá nhiều biểu hiện là một giá trị trong C ++ 11 vẫn là một giá trị trong C ++ 20.
Nicol Bolas

Trường hợp 'mâu thuẫn (ion)' giữa phiên bản? Câu hỏi của bạn chính xác là gì?
Galigator

1
Xin lỗi vì sự thay đổi của C ++ 20 , nhưng tôi đã nhận thấy sự không nhất quán trong tiêu chuẩn.
Maggyero

Câu trả lời:


5

Định nghĩa giá trị ban đầu chỉ là một nhãn: chúng tôi đặt các giá trị nhất định (cụ thể là các giá trị không phải là giá trị) và đặt tên cho chúng. Không thể lấy địa chỉ của họ ngoại trừ thông qua thisviệc sử dụng bất thường (ít nhiều vì chúng là tạm thời), do đó, một số quyền tự do nhất định có thể được thực hiện với sự sáng tạo và tuyên truyền của họ mà không phá vỡ bất cứ điều gì. (Xem thêm một cuộc thảo luận gần đây về họ không phải là người có bản sắc.)

Định nghĩa mới nói một cách rõ ràng rằng một giá trị là một khởi tạo, đang chờ để xảy ra sự cố: một khi một đối tượng mục tiêu được xác định cho nó, đó là những gì được khởi tạo. (Điều quan trọng cần lưu ý là việc khởi tạo vẫn xảy ra khi giá trị được xây dựng, không phải ở nơi đó.) Điều này có tên là bản sao bắt buộc của elision, dựa trên tối ưu hóa tương đương đã phổ biến.

Đối với ví dụ, các định nghĩa loại giá trị mới được xem là đơn giản hơn nhiều đến mức cần ít ví dụ hơn. Vẫn còn một cái cho xvalues ​​(là loại phụ nhất).


Cảm ơn bạn và các bình luận viên! Điều đó khá nhiều giải thích nó!
Daniel Stephens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.