2012-02-13 38 views
8

Giả sử rằng tôi có một lớp học như thế:Sự khác nhau giữa 'T & `và` const T &' cho tất cả const lớp

class Foo : boost::noncopyable 
{ 
public: 
    Foo(int a, int b); 

    const int something; 
    const int something_else; 
    const std::string another_field; 
    // and that's that, no more methods nor fields 
}; 

Bây giờ, là có bất kỳ sự khác biệt thực tế giữa việc tiếp cận các đối tượng của lớp này thông qua một Foo&, trái ngược với const Foo&, ngoài hai loại này là hai loại riêng biệt?

Sẽ không có bất kỳ sự khác biệt nào khi truy cập vào các trường của chúng tôi, vì chúng là const, vì vậy chúng sẽ được truy cập thông qua const T&.

Nhưng có bất kỳ sự khác biệt nào trong số khi nói đến toàn bộ lớp học không? Một cái gì đó để làm với các mẫu, có lẽ? Có gì không?


Bây giờ templatetypedef has written a nice answer, mà tiếc là không hữu ích trong trường hợp này, tôi nghĩ rằng nó muốn được tốt đẹp để nhấn mạnh rằng đó là rất nhiều về những gì bạn có thể làm khi bạn đã có một tài liệu tham khảo (lưu ý tất cả những "truy cập"), không phải về những gì bạn có thể liên kết với tham chiếu.

Vì vậy, bạn có thể giả định rằng ref đã ở đó, bị ràng buộc với một số đối tượng. Bây giờ là tất cả về những gì có thể được thực hiện với nó.

+0

Một lưu ý phụ, nếu bạn có hai 'Foo' được gọi là 'a' và' b', phép gán 'a = b' là bất hợp pháp. Đó là điều bạn muốn? – fredoverflow

+1

@FredOverflow: Có, nó thậm chí còn được làm rõ ràng: 'class Foo: boost :: noncopyable'. – Fanael

Trả lời

13

Tôi không chắc chắn nếu điều này là những gì bạn đang tìm kiếm, nhưng xem xét chức năng này:

void DoSomething(Foo& fooRef); 

Trong trường hợp này, bạn không thể gọi

DoSomething(Foo()); // Error- can't bind a reference to a temporary 

Tuy nhiên, nếu chúng tôi có chức năng này:

void DoSomethingConst(const Foo& fooRef); 

Sau đó, chúng tôi thực sự có thể gọi

DoSomethingConst(Foo()); // Okay - const reference can bind to a temporary 

Vì vậy, có một sự khác biệt một chút ở chỗ một tham chiếu const khả năng có thể liên kết với một tạm thời Foo khi một const tài liệu tham khảo không thể không. Do đó, bạn có thể muốn các chức năng tham gia vào Foo s để chụp trong một const Foo& thay vì một Foo& để làm cho nó có thể gọi hàm bằng thời gian.

Hy vọng điều này sẽ hữu ích!

+0

+1. Cũng không có một số tối ưu hóa trình biên dịch có thể làm cho 'const' những thứ? –

+0

@SethCarnegie Tôi đã nghĩ về điều đó, nhưng vì tất cả các thành viên đều là const, nên việc tối ưu hóa có thể xảy ra không? 1 từ tôi nữa. –

+0

Ồ, mặc dù điều đó hiển nhiên là đúng, nhưng nó có thể liên quan đến tham chiếu hơn là bạn có thể làm gì khi truy cập nó. Và tôi nghi ngờ tôi sẽ cần phải tạm thời loại này. Vì vậy, trong khi tôi đánh giá cao bạn trả lời, tôi không thể thành thật upvote nó. – Fanael

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