2010-06-12 5 views
11

Tôi thấy có thể làm điều đó nhưng tôi không hiểu sự quan tâm.Mục đích của const_cast <> trên biến động là gì?

+0

Bạn có hỏi về việc đúc từ 'const volatile' thành' volatile' hay cái gì khác không? –

+0

Như mọi khi, việc đăng một số mã sẽ giúp ích. –

+0

Thẻ C bị xóa vì ngôn ngữ C không có 'const_cast <>' –

Trả lời

22

Đây là một số Dr. Dobbs article bởi Andrei Alexandrescu có nhiều thông tin chi tiết về nó.

+0

Đó là một bài viết cực kỳ thú vị. Được thăng hạng. – Puppy

+0

Như với nhiều điều khác Alexandrescu đã viết, bài viết đó là khai sáng. Tôi hỏi một câu hỏi về bài viết đó và sự lạm dụng của vòng loại "dễ bay hơi" mà anh ta đề xuất một thời gian trước đây http://stackoverflow.com/questions/2491495/may-volatile-be-in-user-defined-types-to- help-writing-thread-safe-code –

+0

Thật vậy, một bài viết tuyệt vời. Cám ơn vì đã chia sẻ. +1. – jweyrich

3

constvolatile âm thanh như chúng đề cập đến cùng một ý tưởng về một biến, nhưng chúng không giống nhau. Không thể thay đổi biến số const bằng mã hiện tại. Biến số volatile có thể được thay đổi bởi một số thực thể bên ngoài bên ngoài mã hiện tại. Có thể có biến số const volatile - đặc biệt là một số thứ như đăng ký bộ nhớ được ánh xạ - được máy tính thay đổi vào thời điểm chương trình của bạn không thể dự đoán, nhưng mã của bạn không được phép thay đổi trực tiếp. Bạn có thể sử dụng const_cast để thêm hoặc xóa const hoặc volatile ("cv-qualification") thành một biến.

4

constvolatile là trực giao.

const nghĩa là dữ liệu chỉ đọc.

volatile có nghĩa là biến có thể thay đổi do các lý do bên ngoài để trình biên dịch cần phải đọc biến từ bộ nhớ mỗi khi được tham chiếu.

Vì vậy, việc xóa const cho phép bạn viết vị trí khác chỉ đọc (mã phải có một số kiến ​​thức đặc biệt về vị trí thực sự có thể sửa đổi). Bạn không nên xóa volatile để viết nó vì bạn có thể gây ra hành vi không xác định (do 7.1.5.1/7 - If an attempt is made to refer to an object defined with a volatile-qualified type through the use of an lvalue with a non-volatile-qualified type, the program behaviour is undefined.)

+2

'const_cast' áp dụng cho cả' const' và 'volatile' và trong khi có khả năng xóa' volatile' có thể gây ra hành vi không xác định , có những trường hợp không có. I E. việc thêm các rào cản bộ nhớ sẽ buộc trình biên dịch không lưu vào bộ nhớ đệm và cung cấp một sự bảo đảm mạnh hơn rằng 'volatile' (không chỉ biến sẽ không được lưu trữ, nhưng nó sẽ không được sắp xếp lại bên ngoài phần quan trọng). –