1. Vấn đề nó giải quyết
C++23 lấp hai khoảng trống về suy luận và scope. Constructor kế thừa có thể tham gia CTAD, và alias declaration có thể nằm trong init-statement của if hoặc switch với scope gọn.
2. Kiến thức cần có
Ngày 4: template và class template argument deduction.
Đã biết init-statement của
ifvàswitch.
3. Ý tưởng cốt lõi
Inherited CTAD cho template dẫn xuất mượn manh mối suy luận của constructor. Alias init-statement là từ vựng tạm chỉ thấy trong condition và body theo sau. 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
if (using score_t = int; score_t{7} > 5) { }5. Cách nó hoạt động
Ví dụ tạo biểu thức hoặc đối tượng nhỏ nhất cho CTAD từ inherited constructor và alias trong init-statement.
Chương trình dùng alias có scope trong
ifvà đặt cú pháp inherited CTAD sau guard hỗ trợ rõ ràng.Cuối cùng, nó in hoặc kiểm tra nhánh được chọn cùng ghi nhận trung thực về mức hỗ trợ compiler để dễ đối chiếu.
6. Lỗi thường gặp
Cho rằng mọi constructor kế thừa đều tạo deduction guide hữu ích có thể sai khi không suy ra được tham số; đưa alias ra scope rộng làm mất lợi ích.
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 wrapper dẫn xuất nhỏ có đối số constructor suy ra được và tên kiểu cục bộ chỉ dùng trong một nhánh.
Tránh dùng khi CTAD khi template argument tường minh diễn đạt ý nghĩa miền bài toán rõ hơn.
8. Ví dụ đơn giản
Nhánh kiểm tra tạo using score_t = int chỉ tại nơi biểu thức điểm được kiểm tra. 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/19_inherited_ctad_alias_init_statements/main.cpp
#include <iostream>
#if defined(ENABLE_INHERITED_CTOR_CTAD)
template <class T>
struct Box {
T value;
Box(T input) : value(input) {}
};
template <class T>
struct Tagged : Box<T> {
using Box<T>::Box;
};
#endif
int main() {
if (using score_t = int; score_t{7} > 5)
std::cout << "alias init-statement selected\n";
#if defined(ENABLE_INHERITED_CTOR_CTAD)
Tagged item{42};
std::cout << item.value << '\n';
#else
std::cout << "inherited CTAD demo disabled\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ó — Khi constructor kế thừa chỉ nhắc một phần tham số của class template dẫn xuất, CTAD suy ra được phần nào và phần nào vẫn không thể?