15

Khi thông số mutable được sử dụng trong khai báo thành viên dữ liệu không tĩnh, dữ liệu có thể thay đổi bất kể phần còn lại của đối tượng được coi là const hay không. Với thực tế này, chúng tôi có thể dễ dàng có ấn tượng rằng thông số mutable là cùng một loại điều như bộ định tính const, hóa ra là không đúng sự thật. Trên thực tế, ngôn ngữ phân loại các thông số mutable làm trình chỉ định lớp lưu trữ. Điều này khá trực quan vì mutable không chỉ định thời lượng lưu trữ.Tại sao trình chỉ định có thể thay đổi được phân loại là bộ định danh lớp lưu trữ, nhưng không phải là một bộ định tính?

Các lý do đằng sau quyết định thiết kế này là gì?

Điều gì sẽ làm cho nó ít hợp lý hơn dường như nếu mutable là một vòng loại?

Ưu điểm của việc biến nó thành bộ định danh lớp lưu trữ là gì?

+0

Câu hỏi của bạn được trả lời trực tiếp trong [dcl.stc] của N4140: 'Trình định danh có thể tắt trên thành viên dữ liệu lớp vô hiệu hóa một trình chỉ định const được áp dụng cho đối tượng lớp chứa và cho phép sửa đổi thành viên của lớp có thể thay đổi được mặc dù phần còn lại của đối tượng là const (7.1.6.1). ' –

+2

'const' và' volatile' là một phần của kiểu. 'mutable' không phải. –

+1

Việc triển khai được phép đặt đối tượng const vào bộ nhớ chỉ đọc - nhưng không phải là thành viên có thể thay đổi được. Vì vậy, nếu bạn nheo mắt một chút thì nó không hoàn toàn không liên quan đến việc lưu trữ. –

Trả lời

11

cv-qualifier s sửa đổi/hạn chế ngữ nghĩa của đối tượng; mutable thì không. Nó là một phần của các loại sẽ là không cần thiết trong thực tế tất cả các tình huống, trong khi đòi hỏi phải nhiều đoạn văn về chuyển đổi con trỏ, vv

Do đó nó đã được quyết định để làm cho nó một decl-specifier đó không phải là một type-specifier . Vì const có thể khiến đối tượng được đưa vào bộ nhớ được bảo vệ chống ghi, mutable có thể khiến đối tượng không được đưa vào bộ nhớ như vậy, cho thấy nó là một bộ định dạng lớp lưu trữ .

+0

Tôi cho rằng một giả thuyết 'mutable int C :: *' (với 'mutable' là một phần của kiểu được trỏ tới) có thể là được sử dụng để thay đổi 'int' subobject' 'của đối tượng' const C' thông qua cú pháp con trỏ thành thành viên, nhưng chắc chắn chi phí lớn hơn nhiều so với lợi ích. –

+4

Người giải quyết có thể giải thích những gì cô ấy muốn? – Columbo

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