Khi sử dụng typeid
trên đối tượng đa hình, tôi nghĩ đối tượng phải được xác định (không chỉ là khai báo) vì hoạt động typeid
cần lấy thông tin của đối tượng tại thời gian thời gian chạy. Dưới đây là mã của tôi:Khi sử dụng typeid trên một đối tượng đa hình, nó phải được xác định?
#include <iostream>
#include <typeinfo>
class D {
virtual ~D() {}
};
extern D d;
int main()
{
std::cout << typeid(d).name() << std::endl;
std::cout << sizeof(d) << std::endl;
}
Và với clang 3.4, tôi đã nhận lỗi liên kết:
undefined reference to `d'
Nhưng với g++ 4.8.1, nó hoạt động tốt và tôi đã nhận kết quả:
1D
8
Câu hỏi của tôi :
- Cái nào là đúng?
- Cách g ++ triển khai
typeid
? Làm thế nào nó có thể lấy thông tin từ một đối tượng đa hình mà không có định nghĩa?
Tôi không biết cái nào là đúng, nhưng [g ++ có lỗi trình liên kết] (http://coliru.stacked-crooked.com/a/288ddd8f4e70f535) với 'extern D & d'. Vì vậy, có lẽ g ++ là đủ thông minh để tìm ra rằng 'd' phải là loại' D' (cho nó không phải là con trỏ cũng không tham khảo) –
@BryanChen Nhưng có lẽ không được phép theo tiêu chuẩn ...? – songyuanyao
Tôi nghĩ lý do tại sao g ++ dường như hoạt động tốt là kiểu 'd'. Đó là * tĩnh * 'D', do đó trình biên dịch biết loại' d', và có thể g ++ đã tối ưu hóa mã để lấy 'typeinfo' của' d' trong thời gian chạy. Tuy nhiên, nếu kiểu 'd' là' D & 'hoặc' D * ', trình biên dịch không biết kiểu của nó ** trong thời gian biên dịch **, vì vậy nó không thể tối ưu hóa mã. – ikh