2015-07-28 18 views
10

Vì vậy, một vài ngày trước, tôi đã học về std :: addressof. Tại http://en.cppreference.com/w/cpp/memory/addressof một thi thể được đưa ra:std :: addressof - thực hiện lạ

template< class T > 
T* addressof(T& arg) 
{ 
    return reinterpret_cast<T*>(
       &const_cast<char&>(
        reinterpret_cast<const volatile char&>(arg))); 
} 

Theo tôi thấy điều này chỉ có thể được thực hiện như:

template<typename T> 
T* addressof(T& var) 
{ 
    return &var; 
} 

Tại sao những kẻ ở cppreference đã chọn để thực hiện nó với 3 phôi? Có bất kỳ chi tiết nào tôi thiếu hay không đang làm cho việc triển khai của họ tốt hơn. Điểm nào trong việc sử dụng dễ bay hơi khi tất cả những gì bạn làm là cast?

+1

Quá tải địa chỉ của nhà điều hành sẽ phá vỡ triển khai thứ hai. – SirGuy

+0

cũng xem xét điều này: http://stackoverflow.com/questions/6494591/how-can-i-reliably-get-the-address-of-an-object/6495205#6495205 – NathanOliver

Trả lời

7

Nếu nó có thể được thực hiện như trong ví dụ của bạn, sẽ không cần thiết. Vấn đề là nó cung cấp cho bạn địa chỉ của một đối tượng, ngay cả khi địa chỉ của operator& cho loại đó đã bị quá tải.

+0

Aha tôi hiểu. Và những gì là điểm đúc để const dễ bay hơi &, thay vì chỉ char &? – GeneralFailure

+0

@GeneralFailure Đó là để bạn có thể vượt qua 'const' hoặc' volatile' lvalues ​​đủ điều kiện. Bạn có thể thử xóa mục đó để xem. – juanchopanza

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