Để thêm const
vào đối tượng không phải là const, là phương thức được ưu tiên? const_cast<T>
hoặc static_cast<T>
. Trong một câu hỏi gần đây, ai đó đã đề cập rằng họ thích sử dụng static_cast
, nhưng tôi đã nghĩ rằng const_cast
sẽ làm cho ý định của mã rõ ràng hơn. Vậy lập luận cho việc sử dụng static_cast
để tạo ra một biến const là gì?const_cast vs static_cast
Trả lời
Không sử dụng một trong hai. Khởi tạo một tham chiếu const đó đề cập đến đối tượng:
T x;
const T& xref(x);
x.f(); // calls non-const overload
xref.f(); // calls const overload
Hoặc, sử dụng một implicit_cast
hàm mẫu, như the one provided in Boost:
T x;
x.f(); // calls non-const overload
implicit_cast<const T&>(x).f(); // calls const overload
Với sự lựa chọn giữa static_cast
và const_cast
, static_cast
chắc chắn là một lợi thế: const_cast
nên chỉ được sử dụng để bỏ đi constness vì nó là dàn diễn viên duy nhất có thể làm như vậy và bỏ đi constness vốn đã nguy hiểm. Sửa đổi một đối tượng thông qua một con trỏ hoặc tham chiếu thu được bằng cách bỏ đi constness có thể dẫn đến hành vi không xác định.
Tôi muốn nói static_cast
là thích hợp hơn vì nó chỉ cho phép bạn truyền từ không const
đến const
(an toàn) và không theo hướng khác (không nhất thiết phải an toàn).
Điều này dường như phù hợp với ý kiến của Scott Meyers; xem _Effective C++ _, Khoản 3, trong ví dụ "Tránh trùng lặp ...". –
Đây là trường hợp sử dụng tốt cho mẫu chức năng implicit_cast.
Bạn có thể viết dàn diễn viên của riêng bạn:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}
- 1. trống static_cast * char * vs static_cast trống ** char **
- 2. static_cast vs dynamic_cast
- 3. C++ sự khác biệt giữa việc thêm const-ness với static_cast và const_cast của đối tượng "this"?
- 4. static_cast safety
- 5. const_cast VS có thể thay đổi? bất kỳ sự khác biệt?
- 6. Quá tải static_cast?
- 7. static_cast với tăng :: shared_ptr?
- 8. Câu hỏi về const_cast trong C++
- 9. const_cast của một thành viên const tĩnh
- 10. Có được phép trỏ static_cast một void *
- 11. C++ sử dụng const_cast thay vì C-style phôi
- 12. Toán tử chuyển đổi được triển khai với static_cast
- 13. static_cast có thể ném một ngoại lệ trong C++?
- 14. Sự khác nhau giữa static_cast và Implicit_cast là gì?
- 15. mà cast nhanh hơn static_cast <int>() hoặc int()
- 16. Có gì với static_cast với nhiều đối số?
- 17. static_cast cho các loại do người dùng xác định
- 18. Sự khác nhau giữa static_cast và reinterpret_cast là gì?
- 19. Mục đích của const_cast <> trên biến động là gì?
- 20. J2ME VS Android VS iPhone VS Symbian VS Windows CE
- 21. Exec vs ExecWait vs ExecShell vs nsExec :: Exec vs nsExec :: ExecToLog vs nsExec :: ExecToStack vs ExecDos vs ExeCmd
- 22. bigtable vs cassandra vs simpledb vs dynamo vs couchdb vs hypertable vs riak vs hbase, họ có điểm gì chung?
- 23. Làm cách nào để có thể sử dụng static_cast với thừa kế ảo?
- 24. Tại sao static_cast (* này) thành một lớp cơ sở tạo một bản sao tạm thời?
- 25. Tại sao có mức độ ưu tiên cho các toán tử như static_cast?
- 26. Tại sao điều quan trọng là sử dụng static_cast thay vì reinterpret_cast ở đây?
- 27. Trong C++, sự khác nhau giữa static_cast <double> (a) và double (a) là gì?
- 28. Tại sao tôi không thể static_cast giữa char * và unsigned char *?
- 29. Làm cách nào để static_cast có thể truyền int sang char chứ không phải reinterpret_cast?
- 30. ACE vs Boost vs Poco vs wxWidgets
Hầu hết các diễn viên có thể được "nguy hiểm". – curiousguy
Scott Meyers đưa ra một ví dụ về việc sử dụng 'static_cast' đến' const' theo sau bởi 'const_cast' để tạo phiên bản 'const' không' của 'operator []' để gọi phiên bản 'const'. Có thể đạt được điều tương tự bằng cách sử dụng tham chiếu const không? –
Dường như bạn * có thể * thay thế 'static_cast' bằng cách khởi tạo một tham chiếu const mới, nhưng tất nhiên bạn vẫn phải sử dụng' const_cast' để trả về tham chiếu không const. Tôi không chắc chắn nếu đây là hành vi trình biên dịch cụ thể hoặc nền tảng, mặc dù, hoặc nếu nó ngụ ý bởi bất kỳ các yêu cầu trong tiêu chuẩn. –