std::addressof
时间: 2024-01-10 15:02:16 浏览: 145
`std::addressof` 是一个 C++ 标准库中的函数,它可以获取一个对象的地址,即使这个对象实现了重载的取地址运算符 `&`。与使用普通的取地址运算符 `&` 不同,`std::addressof` 可以确保返回的地址是指向对象的实际地址,而不是重载 `&` 运算符返回的地址。
`std::addressof` 的函数原型如下:
```cpp
template <typename T>
T* addressof(T& arg) noexcept;
```
使用方法如下:
```cpp
int n = 42;
int* p = std::addressof(n);
```
在上面的示例中,`std::addressof` 获取了 `n` 对象的地址,并将其赋值给了指针 `p`。注意,`std::addressof` 返回的是一个指针类型。
相关问题
std::_addressof
`std::_addressof`是一个用来获取对象地址的函数模板,它的定义通常如下:
```c++
template <typename T>
constexpr T* _addressof(T& arg) noexcept
{
return reinterpret_cast<T*>(&const_cast<char&>(reinterpret_cast<const volatile char&>(arg)));
}
```
它的作用是获取一个对象的地址,相比于直接使用取地址符`&`,它可以避免一些特殊情况下的问题,例如:
- 对于位域成员,`&`会返回包含该成员的整个对象的地址,而`std::_addressof`只返回该成员的地址。
- 对于重载了取地址运算符`&`的类对象,`&`会调用类中的取地址运算符,而`std::_addressof`会直接返回对象的地址。
需要注意的是,`std::_addressof`是一个C++标准库内部的实现细节,不应该在用户代码中直接使用。在需要获取对象地址的情况下,应该优先使用取地址符`&`。
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) };
这是一个 C++ 语言中的代码片段,它定义了一个名为 `_a` 的指针数组,其中第一个元素为 `nullptr`,第二个元素为一个指向 `_t1` 的 `void*` 指针。具体来说,`std::addressof` 函数返回 `_t1` 的地址,`reinterpret_cast` 将其转换为 `const void*` 类型,再使用 `const_cast` 去掉 `const` 属性,最终得到一个 `void*` 类型的指针,赋值给 `_a[1]`。请注意,这段代码的正确性还取决于 `_t1` 的声明和定义。
阅读全文