Đây là những gì Bjarne Stroustrup nói về việc tại sao họ giới thiệu using
thay vì mở rộng typedef
: "tên tiếp theo những gì nó đề cập đến"
Từ khóa sử dụng được sử dụng để có được một ký hiệu tuyến tính Chúng tôi đã thử với giải pháp typedef thông thường và phức tạp, nhưng không bao giờ quản lý để có được giải pháp hoàn chỉnh và mạch lạc cho đến khi chúng tôi giải quyết theo cú pháp ít mơ hồ hơn.
Ông cũng tuyên bố rằng anh thích cú pháp này cũng nhiều hơn cho typedefs thông thường:
Ngoài việc là quan trọng trong việc kết nối với các mẫu, loại bí danh cũng có thể được sử dụng như một khác nhau (và IMO tốt hơn) cú pháp để bí danh kiểu thông thường:
using PF = void (*)(double);
Ông là khá chính xác ở đây, điều này dường như rất sạch sẽ. Ngược lại một typedef sẽ vô cùng phức tạp với tên là đâu đó ở giữa:
typedef void(*PF)(double);
Dưới đây là một explanation (xem trang 4) từ đề xuất của họ mà thậm chí còn sâu sắc hơn:
nó đã được đề nghị (lại) sử dụng từ khoá typedef - như thực hiện trong giấy [4] - để giới thiệu mẫu bí danh:
template<class T>
typedef std::vector<T,MyAllocator<T>> Vec;
đó ký hiệu có lợi thế của việc sử dụng một chìa khóa từ đã được biết đến để giới thiệu một bí danh loại. Tuy nhiên, nó cũng hiển thị một số nhược điểm trong đó sự nhầm lẫn của việc sử dụng một từ khóa được biết đến để giới thiệu một bí danh cho một loại tên trong một bối cảnh mà bí danh không chỉ định một loại, nhưng một mẫu; Vec
là không phải là bí danh cho một loại và không được sử dụng cho tên đã nhập. Tên Vec
là tên cho họ std::vector<*,MyAllocator<*>>
- trong đó dấu hoa thị là trình giữ chỗ cho tên loại. Do đó, chúng tôi không đề xuất cú pháp "typedef".
template<class T>
using Vec = std::vector<T,MyAllocator<T>>;
có thể được đọc/hiểu là: từ bây giờ trở đi, tôi sẽ sử dụng Vect<T>
như một từ đồng nghĩa với std::vector<T,MyAllocator<T>>
. Với việc đọc đó, cú pháp mới cho răng cưa có vẻ hợp lý.
Vì vậy, ông đã cơ bản hai điểm ở đây:
- Mẫu
using
trở thành một gia đình các loại, không phải là một loại, vì vậy typedef
là "sai"
using
có thể được đọc gần như là một tiếng anh câu
@Cyber, không phải vậy. Tôi biết rằng 'using' cho lợi thế của việc xác định một họ typedefs. Những gì tôi hỏi là tại sao những người tiêu chuẩn quyết định mở rộng này bằng cách sử dụng từ khóa 'using' thay vì từ khóa' typedef'. Điều này có vẻ như nó chỉ thêm nhầm lẫn trong ngôn ngữ. – tohava
Có thể điều này liên quan đến các vấn đề được đề cập trong N1406 và cách N1499 giải quyết chúng. Giải pháp được phản ánh trong cú pháp: các bí danh mẫu không * xác định loại *, vì mẫu typedef sẽ đề xuất và phản đối đề xuất ban đầu của các mẫu typedef cho phép chuyên môn hóa (trong một phiên bản của nó). – dyp
TL; DR vì typedef là một hack không thể đọc được khủng khiếp và có một cơ hội để thay thế nó bằng một cú pháp sạch hơn, nhẹ nhàng hơn. –