Tôi có cảm giác này khi chơi với tài liệu tham khảo constexpr. Nhưng bản thân vấn đề không liên quan gì đến constexpr, nó chỉ tự nó bộc lộ ra mà thôi.
Chúng ta biết rằng có "con trỏ tới const" và có "con trỏ const". Ngẫu nhiên thay, vì cái sau được sử dụng ít thường xuyên hơn cái trước, nên tên của chúng thực sự thường được dùng để chỉ cái trước. Tuy nhiên, không có sự phân biệt như vậy đối với các tài liệu tham khảo vì chúng không thể gắn kết lại được. Vì vậy, chúng tôi chỉ có "tham chiếu const" chứ không phải "tham chiếu đến const". Đây là một thuật ngữ phổ biến màđược sử dụngĐiều này cũng đúng trong các tiêu chuẩn. Nhưng điều này có vẻ không đúng với tôi.
Hãy xem xét một số ví dụ nổi tiếng được nhận xét bằng thuật ngữ phổ biến này:
int i = 0; // Giá trị
int* pi = &i; // Con trỏ tới i
const int* cpi = &i; // Con trỏ tới const i
int const* cpi = &i; // Con trỏ tới const i (kiểu East-const)
int* const pci = &i // Hằng con trỏ tới i
int& ri = i; // Tham chiếu tới i
const int& rci = i; // Hằng tham chiếu tới i
int const& rci = i; // Const tham chiếu tới i (kiểu East-const)
Bây giờ chúng ta hãy xem xét kỹ hơn các dòng trên:
const int* cpi = &i; // Con trỏ tới const i
const int& rci = i; // Hằng tham chiếu tới i
const int*
khai báo "con trỏ tới const" trong khi const int&
Khai báo "tham chiếu const". Thứ tự trong khai báo giống nhau, thứ tự trong nghĩa khác nhau. Có một sự mâu thuẫn rõ ràng ở đây. Nhưng nếu chúng ta gọi nó là "tham chiếu đến const" thì sự mâu thuẫn sẽ biến mất. Thứ tự là như nhau ở cả hai bên.
cùng với constexpr
Với sự ra đời của , căng thẳng gia tăng:
constexpr int& cri = i; // Constexpr tham chiếu tới i
constexpr const int& crci = i; // Constexpr const tham chiếu tới i
Tham chiếu "Constexpr const"? Ừm? tài liệu nói rõ ràng :
MỘT constexpr
công cụ xác định được sử dụng trong khai báo đối tượng ngụ ý hằng số
.
Một tài liệu tham khảo là một đối tượng. Vì vậy, khi constpxr
Đã hằng số
Tại sao chúng ta vẫn cần nó? Tuy nhiên, nếu Tôi
là const, chúng tôi vẫn cần nó. Nhìn chán nản.
Nhưng với sự trợ giúp của "tham chiếu đến const", sự thất vọng không còn tồn tại nữa. chúng tôi sẽ crci
Được gọi là "tham chiếu constexpr tới const i". Bây giờ thì rõ ràng rồi,hằng số
áp dụng cho các đối tượng tham chiếu, trong khi constexpr
áp dụng chotrích dẫn chính nó, nêu rõ thực tế là nó có thể được sử dụng trong ngữ cảnh constexpr. Và đó là const vì tất cả các tham chiếu đều là const. Có ý nghĩa. Để làm cho nó phù hợp hơn với con trỏ, chúng ta thậm chí có thể sử dụng cú pháp giả định sau:
const int& constexpr crci = i; // Constexpr tham chiếu tới const i
const int* const pci = &i; // Con trỏ const tới const i (tính nhất quán hoàn hảo)
Nhưng đó không phải là cách C++ hoạt động, dù tốt hay xấu.
Khái niệm "tham chiếu đến const" thực sự đã giúp tôi hiểu được điều "tham chiếu const const".
Bạn nghĩ gì? Khái niệm "tham chiếu đến const" nghe có thuyết phục bạn không?
Đúng,const int&
Tên chính xác của là "cặphằng số
int
trích dẫn".
Nó thường được gọi là "hằng số
Phải int
trích dẫn" (có lẽ vì nó nghe hay hơn đối với một số người), nhưng về mặt kỹ thuật thì đây là một cách gọi sai.
Mặc dù chúng không thể gắn kết lại được nhưng bản thân các tài liệu tham khảo không bao giờhằng số
(tức là để tham khảo,std::is_const_v
luôn bằngSAI
).
constexpr const int& crci
Tham chiếu "Constexpr const" hả? ... Hãy gọi crci "tham chiếu const i"
Đúng vậy,crci
là "tham chiếu constexpr tới const i".
Để làm cho nó phù hợp hơn với các con trỏ, chúng ta thậm chí có thể sử dụng cú pháp giả định sau:
const int& constexpr crci = i; // Constexpr tham chiếu tới const i
const int* const pci = &i; // Con trỏ const tới const i (tính nhất quán hoàn hảo)
Thực lòng tôi không hiểu đề xuất này sẽ cải thiện tính nhất quán như thế nào. int *constexpr pci;
Nó không được phép dùng cho con trỏ, vậy tại sao nó lại được phép dùng cho tài liệu tham khảo?
Mọi thứ dường như khá nhất quán ngay từ đầu:
constexpr const int *a; // constexpr (và const) con trỏ tới const int
constexpr const int &a; // constexpr (nhưng không phải const) tham chiếu tới const int
Có, thêmconstexpr
bản thân nó không làm tài liệu tham khảohằng số
, nhưng tôi không nghĩ nó cần sửa. (hằng số
Báo giá và khônghằng số
Sự khác biệt giữa các trích dẫn là gì? )
Xin lưu ý rằngconstexpr
Không phải là một phần của kiểu, mà là thuộc tính của biến. (Ví dụ constexpr int x;
Sẽ x
khai báo là const int
loại, thay vì một số giả thuyết constexpr int
).
Tôi là một lập trình viên xuất sắc, rất giỏi!