1. Vấn đề nó giải quyết
Ref qualifier chọn hành vi member cho lvalue hoặc temporary; inline namespace tạo phiên bản API mà không đổi tên qualified thường dùng. Nó làm ràng buộc quan trọng hiện rõ thay vì bắt người đọc đoán. Bài chỉ giữ phần cốt lõi C++11 vừa đủ cho một ngày tập trung.
2. Kiến thức cần có
Kiến thức Ngày 27, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: Ref qualifier chọn hành vi member cho lvalue hoặc temporary; inline namespace tạo phiên bản API mà không đổi tên qualified thường dùng. Hãy xác định giá trị hoặc trạng thái liên quan, ai sở hữu nó và quy tắc tác động lúc compile hay lúc chạy.
4. Cú pháp tối thiểu
void show() &; void show() &&; inline namespace v1 { int version(); }5. Cách nó hoạt động
Ví dụ tạo dữ liệu nhỏ, cố định và không cần nhập bàn phím.
C++11 hoặc contract thư viện chuẩn áp dụng quy tắc hôm nay.
Chương trình in kết quả quan trọng để đối chiếu với mã nguồn.
6. Lỗi thường gặp
Trả reference từ member rvalue-qualified có thể làm lộ subobject của temporary chết ngay sau đó.
7. Khi nào nên dùng
Nên dùng khi API cần phân biệt receiver còn sống với temporary hoặc cần tên phiên bản.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Label có tên chọn overload &, temporary chọn &&, và api::version() được tìm qua inline namespace v1. File .cpp dùng dữ liệu cố định và không thêm abstraction ngoài chủ đề.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp11/28_ref_qualified_members_inline_namespaces/main.cpp
#include <iostream>
namespace api {
inline namespace v1 {
int version() {
return 1;
}
}
}
class Label {
public:
void show() & {
std::cout << "persistent label\n";
}
void show() && {
std::cout << "temporary label\n";
}
};
int main() {
Label label;
label.show();
Label().show();
std::cout << "api=" << api::version() << '\n';
}
9. Điều cần nhớ
Tính năng nằm trong phạm vi C++11 của lộ trình này.
Hiểu hệ quả về lifetime, ownership, kiểu và thứ tự trước khi dùng.
Compile với cảnh báo và ưu tiên cách viết nhỏ nhất làm quy tắc hiện rõ.
10. Câu hỏi tự kiểm tra
Dễ — Hai member
void show() &vàvoid show() &&phân biệt loại đối tượng gọi hàm nào?inline namespace v1bên trongapigiúp gọiapi::version()ra sao?Trung bình — Đọc ví dụ nhỏ ở trên. Chương trình sẽ in giá trị hoặc trạng thái nào, và quy tắc nào tạo ra kết quả đó?
Khó — Tìm và giải thích lỗi tinh tế trong tình huống sau: Trả reference từ member rvalue-qualified có thể làm lộ subobject của temporary chết ngay sau đó. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?