Vấn đề ở đây là trình biên dịch dịch
test(_b);
Không như mã tạo một đối tượng tạm thời loại test
đi qua trong tham số _b
, nhưng như một khai báo biến cho một biến có tên _b
loại test
, sử dụng hàm tạo mặc định. Do đó, những gì trông giống như một đoạn mã tạo đối tượng test
tạm thời bằng cách sử dụng hàm tạo thứ hai, thay vào đó đệ quy tạo đối tượng mới kiểu test
và gọi hàm khởi tạo một lần khác.
Để sửa lỗi này, bạn có thể cho biến một tên rõ ràng, chẳng hạn như
test t(_b);
này chỉ có thể được hiểu như là một biến kiểu test
tên t
, khởi tạo bằng cách sử dụng constructor thứ hai.
Tôi có chưa bao giờ thấy điều này trước đây và tôi đã lập trình bằng C++ trong nhiều năm. Cảm ơn bạn đã hiển thị cho tôi một trường hợp khác của ngôn ngữ góc là!
Để có giải thích chính thức: Theo thông số ISO C++ 03, § 6.8:
Có sự mơ hồ trong ngữ pháp liên quan đến biểu thức và khai báo: Biểu thức tuyên bố bằng chuyển đổi loại rõ ràng theo chức năng (5.2.3) là biểu thức con ngoài cùng bên trái có thể không phân biệt được các declarator đầu tiên bắt đầu với một (. Trong những trường hợp báo cáo kết quả là một bản tuyên bố.
(nhấn mạnh của tôi). Nói cách khác, bất cứ lúc nào C++ có thể giải thích một tuyên bố như hoặc là một biểu thức (đối tượng tạm thời dàn diễn viên) hoặc như một khai báo (của một biến), nó sẽ chọn khai báo. C++ spec rõ ràng cung cấp cho
T (a);
Ví dụ về tuyên bố, không phải là một diễn viên của a
đối với loại nội dung T
.
Đây là sốcủa C++ - thay vào đó, biểu thức giống như biểu thức được hiểu là khai báo. Tôi đã nhìn thấy MVP trước đây, nhưng tôi chưa bao giờ thấy nó trong bối cảnh này.
Hy vọng điều này sẽ hữu ích!
Đó là đệ quy do 'test (_b);' nhưng tôi không chắc chắn tại sao. – Roddy
@ Roddy- Tôi chỉ tìm ra; xem câu trả lời của tôi để biết chi tiết. – templatetypedef
Làm sạch phiên bản với những thứ không quan trọng bị loại bỏ: http://ideone.com/z0yc7Q – Yakk