2010-08-25 40 views
8

Tôi hoàn toàn nhận thức được rằng giá trị trả lại của std::type_info::name() được xác định thực hiện.Tại sao type_info :: name() không xác định?

Từ tiêu chuẩn C++ (ISO/IEC 14882: 2003 §18.5.1.7):

Returns: một thực hiện xác định NTBs.

Câu hỏi của tôi là: tại sao? Chức năng thành viên này sẽ không hữu ích hơn nhiều nếu tiêu chuẩn quyết định giá trị trả về là bao nhiêu?

+0

+1 cho tính tò mò này. Tôi đoán, câu trả lời là để cung cấp cho một số vĩ độ để trình biên dịch tôi đoán. – Chubsdad

+0

Vì bạn KHÔNG THỂ trộn các tệp nhị phân giữa các trình biên dịch, miễn là nó nhất quán trong trình biên dịch, nó không phải là một vấn đề lớn. –

Trả lời

4

Về cơ bản, nếu triển khai quyết định rằng họ không thể hoặc không muốn hỗ trợ RTTI, họ chỉ có thể return "";. Nếu tiêu chuẩn buộc nó phải trả lại một cái gì đó, họ có thể giết bất kỳ khả năng nào để có trình biên dịch phù hợp cho môi trường nơi mà các tài nguyên cho RTTI không tồn tại hoặc muốn bị vô hiệu hóa (ví dụ: vi mạch)

Và đừng quên chúng ta không muốn ép buộc một lược đồ ABI/tên-mangling trên bất kỳ trình biên dịch nào.

Điều này tuân theo triết lý C++ "Bạn không trả tiền cho những thứ bạn không cần".

+0

+1 cho đối số RTTI. Nhưng không thể tiêu chuẩn ra lệnh một cái gì đó như * trả lại tên unmangled của loại động nếu RTTI được hỗ trợ và loại tĩnh nếu không *? – Job

+0

@Job: Có thể, nhưng làm cách nào để định dạng tên loại? Và chuỗi được lưu ở đâu? Tôi đồng ý nó sẽ là tốt đẹp để có một kết quả phù hợp hoặc ít nhất là đáng tin cậy 'name()', nhưng không xác định là tốt nhất có thể được thực hiện, do bản chất của trình biên dịch. (Cách họ xử lý các loại là doanh nghiệp của họ và chúng tôi không thể chắc chắn họ xử lý nó như thế nào và nền tảng đích là gì và liệu chúng có cho phép kết quả 'name()' có ý nghĩa hay không.) – GManNickG

+1

Tôi nghĩ '0' isn không phải là một NTBS hợp lệ, vì vậy việc thực hiện như vậy ít nhất phải là 'return" "'. – sbi

2

Trường hợp chúng ta nói về các nhà cung cấp trả về các chuỗi khác nhau, tôi nghĩ đó chỉ là "chúng tôi làm theo cách này, bạn thay đổi" "không, chúng tôi làm theo cách này, BẠN thay đổi". Ngay cả Ủy ban tiêu chuẩn cũng không muốn làm phiền các đội biên dịch, và tạo ra một số tiêu chuẩn trung lập mới không được sử dụng bởi bất kỳ nhà cung cấp nào có xu hướng có nghĩa là tìm kiếm điều gì đó vô nghĩa.

Tại sao chúng không phải tất cả các không gian tên rõ ràng :: class :: functions etc? Một số triển khai hiện tại có thể có lịch sử thuận tiện để nó khớp với tên bị xáo trộn liên kết yêu cầu, bị hoang tưởng (hoặc có khách hàng hoang tưởng) sử dụng lại bộ nhớ, vv ..

Các vấn đề liên quan