Sử dụng &
để lấy địa chỉ của một biến có thể có vấn đề nếu kiểu biến đã quá tải operator&()
. Ví dụ: _com_ptr_ có operator&()
bị quá tải với tác dụng phụ của việc sửa đổi đối tượng.Cách di động và đáng tin cậy nhất để lấy địa chỉ biến trong C++
Bây giờ tôi có một tập hợp phức tạp của các mẫu với các chức năng như thế này:
template<class T>
void process(const T* object)
{
//whatever
}
template<class T>
void tryProcess(T& object)
{
process(&object)
}
Trong tryProcess()
tôi cần để có được một con trỏ T*
giữ địa chỉ của đối tượng thực tế của loại T
.
Việc triển khai trên tryProcess()
sẽ chỉ hoạt động hoàn toàn nếu class T
không bị quá tải operator&()
. Vì vậy, nếu tôi gọi tryProcess<_com_ptr_<Interface>>()
Tôi có thể nhận được kết quả không mong muốn - quá tải operator&()
được kích hoạt.
Trong another question các workaround sau đây là suggested:
template<class T>
T* getAddress(T& object)
{
return reinterpret_cast<T*>(&reinterpret_cast<char&>(object));
}
Với chức năng như vậy tôi có thể thực hiện tryProcess()
như sau:
template<class T>
void tryProcess(T& object)
{
process(getAddress(object))
}
và sẽ luôn luôn nhận được cùng một độc lập hành vi của liệu class T
có operator&()
quá tải. Điều này giới thiệu số không trên không với tối ưu hóa trên trên Visual C++ 7 - trình biên dịch được những gì để làm và chỉ nhận được địa chỉ đối tượng.
Làm cách nào để giải quyết vấn đề này? Làm thế nào nó có thể được cải thiện?
Để tham khảo các độc giả sau này: C++ 11 được chuẩn hóa một phiên bản gọn gàng (trước đây là 'tăng cường') của thành ngữ này, như' std :: addressof': http://en.cppreference.com/w/cpp/ bộ nhớ/addressof' –