std::to_address
來自 cppreference.com
定義於標頭檔案 <memory> |
||
template< class Ptr > constexpr auto to_address( const Ptr& p ) noexcept; |
(1) | (C++20 起) |
template< class T > constexpr T* to_address( T* p ) noexcept; |
(2) | (C++20 起) |
獲取由 p 表示的地址,而無需形成對 p 指向的物件的引用。
1) Fancy pointer 過載:如果表示式 std::pointer_traits<Ptr>::to_address(p) 格式良好,則返回該表示式的結果。否則,返回 std::to_address(p.operator->())。
2) 裸指標過載:如果
T
是函式型別,則程式格式錯誤。否則,返回未修改的 p。目錄 |
[編輯] 引數
p | - | 花式指標或裸指標 |
[編輯] 返回值
表示與 p 相同地址的裸指標。
[編輯] 可能的實現
template<class T> constexpr T* to_address(T* p) noexcept { static_assert(!std::is_function_v<T>); return p; } template<class T> constexpr auto to_address(const T& p) noexcept { if constexpr (requires{ std::pointer_traits<T>::to_address(p); }) return std::pointer_traits<T>::to_address(p); else return std::to_address(p.operator->()); } |
[編輯] 注意
即使 p 不引用已在其上構造物件的儲存,也可以使用 std::to_address
,在這種情況下,不能使用 std::addressof(*p),因為 std::addressof 的引數沒有有效的物件可以繫結。
std::to_address
的花式指標過載檢查 std::pointer_traits<Ptr> 特化。如果例項化該特化本身格式錯誤(通常是因為 element_type
無法定義),則會導致即時上下文之外的硬錯誤並使程式格式錯誤。
std::to_address
還可以用於滿足 std::contiguous_iterator 的迭代器。
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_to_address |
201711L |
(C++20) | 用於將指標轉換為裸指標 (std::to_address ) 的實用程式 |
[編輯] 示例
執行此程式碼
#include <memory> template<class A> auto allocator_new(A& a) { auto p = a.allocate(1); try { std::allocator_traits<A>::construct(a, std::to_address(p)); } catch (...) { a.deallocate(p, 1); throw; } return p; } template<class A> void allocator_delete(A& a, typename std::allocator_traits<A>::pointer p) { std::allocator_traits<A>::destroy(a, std::to_address(p)); a.deallocate(p, 1); } int main() { std::allocator<int> a; auto p = allocator_new(a); allocator_delete(a, p); }
[編輯] 參閱
(C++11) |
提供有關類指標型別的資訊 (類模板) |
[靜態] (C++20)(可選) |
從花式指標獲取原始指標(pointer_to 的逆操作)( std::pointer_traits<Ptr> 的公共靜態成員函式) |