2012-04-12 47 views
5

thể trùng lặp:
When can typeid return different type_info instances for same type?boost :: bất kỳ tối ưu hóa typeid cho C++ 11

Nếu tôi thay đổi dòng operand->type() == typeid(ValueType) dưới đây vào &operand->type() == &typeid(ValueType), mã vẫn hoạt động với gcc và mất tăng ít không gian hơn trong thực thi (và đã làm như vậy trong nhiều năm nay), nhưng tiêu chuẩn C++ 11 có đảm bảo rằng tối ưu hóa này có hoạt động trên các trình biên dịch khác nhau không?

template<typename ValueType> 
ValueType * any_cast(any * operand) 
{ 
    return operand && 
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME 
     std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0 
#else 
     operand->type() == typeid(ValueType) 
#endif 
     ? &static_cast<any::holder<ValueType> *>(operand->content)->held 
     : 0; 
} 
+0

Về mặt kỹ thuật, câu hỏi C++ 03 và câu hỏi này là C++ 11. Chỉnh sửa để làm cho nó rõ ràng không phải là một bản sao (câu trả lời vẫn chính xác) – MSalters

Trả lời

5

Không, nó không được bảo đảm. Xác nhận này có thể kích hoạt:

assert(&typeid(int) == &typeid(int)); 

Mặc dù trình biên dịch khá ngu ngốc để thực hiện điều đó, điều đó có thể xảy ra. Trong thực tế, nó sẽ chỉ thất bại khi typeid đang được so sánh qua ranh giới thư viện động:

assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2()); 

Điều này gần như chắc chắn sẽ kích hoạt.

+1

tìm thấy bài đăng này, khẳng định có thể cháy trong Windows, nhưng có thể không phải trong linux: [link] (http://stackoverflow.com/questions/1819114/when- có thể-typeid-return-khác nhau-type-info-instances-for-same-type) – user1095108

+0

@ user1095108: Ah, sao chép sau khi tất cả. :) – GManNickG

+0

Không hoàn toàn, mọi người vẫn có thể hack any.hpp của họ, nếu họ liên kết tĩnh. – user1095108