2015-11-14 25 views
10

typeid đại diện cho toán tử C++ RTTI cũng là từ khóa C++. Nó trả về một đối tượng std::type_info chứa thông tin cụ thể (động).Tại sao tôi cần phải #include <typeinfo> khi sử dụng toán tử typeid?

Từ những gì tôi hiểu được từ nhiều nguồn khác nhau, một PHẢI bao gồm <typeinfo> khi sử dụng typeid, nếu không chương trình không đúng định dạng. Trong thực tế, trình biên dịch gcc5.2 của tôi thậm chí không biên dịch chương trình nếu tôi không bao gồm tiêu đề đã đề cập trước đó. Tôi không hiểu tại sao việc đưa vào tiêu đề bắt buộc phải sử dụng từ khóa C++ . Tôi hiểu bắt buộc một tiêu đề cho bất cứ khi nào chúng tôi sử dụng một số đối tượng được khai báo/xác định trong tiêu đề đó, nhưng typeid không thuộc loại lớp. Vậy lý do đằng sau việc thực thi này bao gồm tiêu đề <typeinfo> là gì?

+2

Đối với một cái gì đó tương tự, '' cũng cần phải được bao gồm trong trường hợp bạn có thể hoặc có thể không mong đợi. – chris

+0

@chris Tôi nghĩ chỉ khi bạn sử dụng rõ ràng 'std :: initializer_list', điều này có ý nghĩa hơn một chút, vì' std :: initializer_list' là một lớp của riêng nó, không phải là từ khóa, mặc dù được sử dụng ngầm bởi ngôn ngữ chính. – vsoftco

+1

Có, mặc dù có một số trường hợp phức tạp hơn như 'auto list = {1, 2, 3};' và 'cho (auto x: {1, 2, 3}) {}'. – chris

Trả lời

6

Đoạn tiếp theo:

Các typeid biểu thức là biểu hiện giá trị trái trong đó đề cập đến một đối tượng với thời gian lưu trữ tĩnh, loại const đa hình std :: type_info hoặc của một số loại nguồn gốc từ nó.

Vì đây là biểu thức giá trị sử dụng reference initialization để khai báo bộ khởi tạo std::type_info. <typeinfo> chứa định nghĩa cho that object.

+2

Có lẽ đây là lý do, mặc dù tôi tìm thấy thiết kế ngôn ngữ ... chúng ta hãy nói lạ, vì nó cho phép từ khóa phụ thuộc vào tiêu đề ... – vsoftco

4

typeid không phải là người duy nhất cần tiêu đề

new cũng đòi hỏi tiêu đề <new> trong một số trường hợp

Lưu ý: tờ khai ngầm không giới thiệu tên std, std :: bad_alloc, và std :: size_t hoặc bất kỳ tên nào khác mà thư viện sử dụng để khai báo các tên này. Do đó, một biểu thức mới, lệnh xóa biểu thức hoặc hàm gọi là một trong các hàm này mà không bao gồm tiêu đề được tạo đúng. Tuy nhiên, đề cập đến std, std :: bad_alloc, và std :: size_t là ill-form trừ khi tên đã được khai báo bằng cách đưa vào tiêu đề thích hợp. -end lưu ý

See abhay's answer on new keyword

Một nhà điều hành sizeof trả về std :: size_t (Nó không thực sự cần phải bao gồm tiêu đề, nhưng quan điểm của tôi ở đây là nó sử dụng một bí danh mà cũng được định nghĩa trong một tiêu đề)

C++ §5.3.3

kết quả của sizeof và sizeof ... là một hằng số kiểu std :: size_t. [Ghi chú: std :: size_t được định nghĩa trong tiêu đề tiêu chuẩn <cstddef> (18.2).- cuối note]

typeid lớp sử dụng được khai báo trong <typeinfo> tiêu đề

Tiêu đề <typeinfo> tóm tắt

namespace std { 
class type_info; 
class bad_cast; 
class bad_typeid; 
} 

See section 18.7 on iso cpp paper

IMO, C của nó ++ Design Standard kỹ thuật, để giữ cho trình biên dịch gọn gàng, sạch sẽ và nhẹ

+2

size_t là bí danh loại, vì vậy bạn không cần phải bao gồm tiêu đề để sử dụng kết quả của sizeof mặc dù – vsoftco

+0

vâng tôi không nói rằng nó cần phải –

+0

@AbdulRehman nói "typeid không phải là người duy nhất cần tiêu đề" và sau đó giới thiệu "sizeof" có vẻ như bạn đang nói rằng sizeof cũng cần tiêu đề. –

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