template <class T, class U> decltype(*(T*)(0) * *(U*)(0)) mul(T x, U y) {
return x * y;
}
Đoạn mã này được lấy từ số C++11 FAQ của Stroustrup. Tôi hiểu những gì nó làm, đó là nhân hai đối tượng của các loại khác nhau. Điều làm tôi bối rối là cú pháp giữa các tham số mẫu và định nghĩa hàm. Điều gì đang xảy ra bên trong decltype
? Tôi lấy nó rằng nó dereferencing một con trỏ T
chưa được đặt tên được khởi tạo là 0 và nhân nó với con trỏ chưa được đặt tên là U
bị hủy đăng ký và được khởi tạo theo cùng một cách. Tôi có đúng không?Cú pháp khó hiểu với các loại mẫu ẩn danh?
Vâng, nếu đây là những gì đang xảy ra, thì không phải là việc sử dụng các con trỏ, các tham chiếu và thêm dấu ngoặc đơn thừa không? Tôi không thể khởi tạo các loại như thế này trong khi duy trì hiệu quả mong muốn ?:
template <class T, class U> decltype(T(0) * U(0)) mul(T x, U y) {
return x * y;
}
này trông sạch hơn nhiều đối với tôi, và nó không có tác dụng tương tự khi nhân hai con số như trong lần đầu tiên ...
mul(4, 3); // 12
Vậy tại sao Stroustrup nhấn mạnh vào sử dụng cú pháp phức tạp, dereference và cú pháp khởi tạo? Đây là, tất nhiên, trước khi ông giới thiệu cú pháp mới auto
. Nhưng dù sao, câu hỏi của tôi là: Có sự khác biệt nào giữa hai hình thức khởi tạo kiểu trên không? Nơi ông sử dụng con trỏ và ngay lập tức dereferences họ thay vì chỉ đơn giản là làm những gì tôi đã làm, đó là để khởi tạo các loại không có con trỏ hoặc dereferencing? Bất kỳ phản ứng nào được đánh giá cao.
Điều gì sẽ xảy ra khi đưa ra một 'T' không thể xây dựng từ một' int'? –