Trong C ++, để khai báo một đối tượng của một lớp có biến thành viên là const
, chúng ta phải có một hàm tạo mặc định do người dùng định nghĩa. Các mã sau đây minh họa điều này.
class Some {
int value;
};
int main() {
// error: default initialization of an object of const type 'const Some'
// without a user-provided default constructor
const Some some;
return 0;
}
Tuy nhiên, nếu một biến thành viên thuộc sở hữu của một lớp đủ điều kiện là có thể thay đổi, trình biên dịch sẽ không báo cáo bất kỳ lỗi nào. Để tham khảo, tôi biên dịch bằng cách sử dụng lệnh clang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug
. Tôi tự hỏi nếu kết quả này là do lỗi trong trình biên dịch hoặc theo cú pháp được xác định trong ngôn ngữ C ++.
class Some {
mutable int value;
};
int main() {
const Some some;
return 0;
}
mutable
là loại đối lập với const
. Tại sao bạn mong đợi hiệu ứng tương tự?
const
, nghĩa là nó không thể thay đổi và nó có các giá trị chưa được khởi tạo, không sử dụng loại mã này và đó là lý do tại sao nó bị cấm. Khi bạn sử dụng mutable
từ khóa - điều đó có nghĩa là giá trị có thể được thay đổi sau đó, do đó mã có thể được sử dụng theo cách có thể dự đoán được.