1. Vấn đề nó giải quyết
Hàm thành viên truyền thống nhận this ngầm. C++23 cho phép viết object parameter tường minh, nhờ đó suy luận được kiểu và giảm các overload lặp lại.
2. Kiến thức cần có
Ngày 4: template và hàm thành viên.
Ngày 10: value category tại ranh giới return.
3. Ý tưởng cốt lõi
Đọc this Counter& self như ô đối tượng của lời gọi member được đưa ra rõ trong danh sách tham số. Cách gọi vẫn dùng cú pháp member bình thường. Hãy xác định giá trị đang được biến đổi rồi kiểm tra kiểu, lifetime hoặc quyền sở hữu kết quả. Bật C++23 chưa chắc thư viện đã triển khai đủ, vì vậy cần kiểm tra feature-test macro liên quan.
4. Cú pháp tối thiểu
void add(this Counter& self, int n) { self.value += n; }5. Cách nó hoạt động
Ví dụ tạo biểu thức hoặc đối tượng nhỏ nhất cho Explicit object parameter và deducing
this.Chương trình cập nhật bộ đếm nhỏ qua explicit object parameter khi compiler hỗ trợ.
Cuối cùng, nó in hoặc kiểm tra giá trị bộ đếm mới hoặc thông báo hỗ trợ chính xác từ GCC 13 để dễ đối chiếu.
6. Lỗi thường gặp
Vừa viết qualifier
constphía sau vừa dùng explicit object parameter là không hợp lệ vì kiểu đối tượng đã nằm trong tham số đó.Không kiểm tra feature-test macro có thể chọn nhánh mã thư viện hiện tại chưa hỗ trợ.
7. Khi nào nên dùng
Nên dùng khi thư viện cần suy luận dạng cv/ref của đối tượng hoặc dùng chung một triển khai.
Tránh dùng khi member thông thường không cần suy luận và rõ hơn với cú pháp truyền thống.
8. Ví dụ đơn giản
Accessor của container thay bốn overload theo cv/ref bằng một template explicit-object. Chương trình dùng dữ liệu cố định để output dễ kiểm tra.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp23/11_explicit_object_parameter/main.cpp
#include <iostream>
#if defined(__cpp_explicit_this_parameter)
struct Counter {
int value{0};
void add(this Counter& self, int amount) {
self.value += amount;
}
};
#endif
int main() {
#if defined(__cpp_explicit_this_parameter)
Counter counter;
counter.add(5);
std::cout << "counter=" << counter.value << '\n';
#else
std::cout << "explicit object parameters unavailable\n";
#endif
}
9. Điều cần nhớ
Tách quy tắc chuẩn khỏi mức hỗ trợ thực tế.
Làm rõ lifetime, ownership và kiểu suy luận.
Ưu tiên cú pháp ngắn, đúng ý định.
Guard tính năng chưa được hỗ trợ đồng đều.
10. Câu hỏi tự kiểm tra
Dễ — Cú pháp ngắn nhất ở Phần 4 là gì và nhiệm vụ chính của nó là gì?
Trung bình — Đọc chương trình mẫu: giá trị, kiểu hoặc nhánh nào được quan sát, và vì sao?
Khó — Vì sao
this Widget& selfkhông phải tham số đầu tiên thông thường dù tênselfđược dùng giống tham số trong thân hàm?