2010-08-04 23 views
11

Để 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

14

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_castconst_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.

+0

Hầu hết các diễn viên có thể được "nguy hiểm". – curiousguy

+0

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? –

+0

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. –

2

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).

+0

Đ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 ...". –

2

Đây là trường hợp sử dụng tốt cho mẫu chức năng implicit_cast.

1

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; 
} 
Các vấn đề liên quan