2009-06-23 51 views
72

Có sự khác biệt nào giữa các khai báo sau không?tham số tham chiếu const

void somefunc(const Person &p); 
void somefunc(Person const &p); 
+8

Bạn nên lưu ý rằng tham chiếu không liên quan đến câu hỏi: "const Person p" tương đương với "Person const p". –

Trả lời

91

không khác biệt. const liên kết với loại bên trái của nó ... trừ khi nó là phần đầu tiên của khai báo trong trường hợp nó liên kết với bên phải.

Xem: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt

Cá nhân, tôi thấy rằng const T &x đọc tốt hơn. Theo số this, Bjarne cũng thích đặt trước tiên là const. Cụ thể vì từ khóa ban đầu sẽ được gọi là readonlyreadonly int x đọc tốt hơn :-P.

+1

Mặc dù tôi sẽ nói điều đầu tiên phổ biến hơn. – rlbond

+0

@rlbond: Phổ biến hơn phụ thuộc vào ngữ cảnh. Ở một số nơi tôi thấy cái đầu tiên phổ biến hơn ở những người khác, tôi thấy thứ hai phổ biến hơn. Tất cả depnds. –

+6

chắc chắn thứ hai là nhiều hơn * nhất quán * khi giao dịch với indirection. ví dụ: int const * const x; (mọi thứ liên kết bên trái) –

11

Xem này http://www.parashift.com/c++-faq-lite/const-correctness.html

(Xem liên kết mới thay vì: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt)

Cụ 18,6-18,8.

[18.6] "const Fred & x" có nghĩa là gì?

Nó có nghĩa là x bí danh một đối tượng Fred, nhưng x không thể được sử dụng để thay đổi đối tượng Fred đó.

[18.7] Không "Fred & const x" có ý nghĩa gì không?

Không, điều đó là vô nghĩa.

[18.8] "Fred const & x" có nghĩa là gì?

Fred const & x là chức năng tương đương với const Fred & x. Tuy nhiên, câu hỏi thực tế sẽ là được sử dụng.

Đọc phần còn lại của bài viết để biết thêm thông tin. Nhưng về cơ bản, nó nói rằng chúng tương đương nhau, và bạn có thể sử dụng một trong hai cách bạn thấy phù hợp. Tuy nhiên, bạn nên chọn một và gắn bó với nó, để tránh nhầm lẫn trong tương lai.

+4

Tôi sẽ thêm, chọn một và gắn bó với nó khi viết mã mới, nhưng khi sửa đổi mã hiện có, hãy gắn bó với cách mã hiện tại thực hiện. –

47

Có! người đầu tiên dễ đọc hơn :)

+0

tôi đoán bạn muốn nói "dễ đọc hơn với những người đọc LTR!" :) tôi nghe một số người ở phía đông đọc RTL văn bản của họ. –

+2

Không! Thư hai! (Thực sự - bạn phải đọc các định nghĩa từ phải sang trái: Person const * volatile * p; // p là một pinter dễ bay hơi đến một con trỏ trỏ tới một Person.) – MSalters

+1

@litb :: Tôi đọc một trong những ngôn ngữ RTL đó và nó không khó bởi vì nó là ngôn ngữ mẹ đẻ của tôi: D – AraK

4

Nó thực sự là vấn đề về hương vị.

Nếu đọc từ phải sang trái, "Person const & x" lần đọc "x là tham chiếu đến một Người liên tục".

Điều này nghe có vẻ tốt hơn "const Person & x", sẽ là "x là tham chiếu đến một Người, là hằng số".

Vì vậy, nếu một người quen thuộc với hướng đọc từ phải sang trái của các khai báo biến, người ta có thể thích cái đầu tiên.

4

Cả hai đều giống nhau.

const Người & x hiện là phổ biến nhất, vì tiếng Anh đặt tính từ trước danh từ và làm cho nó "giống tiếng Anh hơn".

Biểu mẫu thay thế, Person const & x, được đề xuất dưới dạng ít thành ngữ. Lập luận của họ là hình thức đó luôn luôn có thể được phân tích cú pháp từ phải sang trái, "x là một tham chiếu đến một người const." Lập luận là sự rõ ràng của phân tích cú pháp quan trọng hơn cấu trúc thành ngữ.

Thật không may cho những người đó, biểu mẫu của họ không xử lý mọi thứ. Khi bạn bắt đầu thấy các mảng và các con trỏ hàm và các dạng lạ khác, các quy tắc bắt đầu bị phá vỡ. char * str [10] không thể được viết từ phải sang trái vì mảng phải nằm ở bên phải. void (* tín hiệu (int, void (* fp) (int))) (int) làm cho quyền để lại người cringe trong đau đớn.

Chỉ quy tắc đã từng nảy sinh làm cho tinh thần của tất cả các loại, các quy tắc chiều kim đồng hồ Spiral: http://c-faq.com/decl/spiral.anderson.html

Thông thường, một khi ai đó nhìn thấy xoắn ốc chiều kim đồng hồ, tất cả hy vọng của một quy tắc một phân tích rõ ràng đi ra ngoài cửa sổ. Hầu hết mọi người sau đó chấp nhận rằng const Người & x có lẽ là cách tốt nhất để đi!

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