c++ - 当 operator& 重载时,如何可靠地获取对象的地址?

标签 c++ c++11 operator-overloading memory-address

考虑以下程序:

struct ghost
{
    // ghosts like to pretend that they don't exist
    ghost* operator&() const volatile { return 0; }
};

int main()
{
    ghost clyde;
    ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( 
}

我如何获得clyde的地址?

我正在寻找一种同样适用于所有类型对象的解决方案。 C++03 解决方案会很好,但我也对 C++11 解决方案感兴趣。如果可能,让我们避免任何特定于实现的行为。

我知道 C++11 的 std::addressof 函数模板,但对在这里使用它不感兴趣:我想了解标准库实现者如何实现这个函数模板.

最佳答案

使用 std::addressof .

您可以将其视为在幕后执行以下操作:

  1. 将对象重新解释为对字符的引用
  2. 取那个地址(不会调用重载)
  3. 将指针转换回您的类型的指针。

现有的实现(包括 Boost.Addressof)正是这样做的,只是额外注意 constvolatile 限定。

关于c++ - 当 operator& 重载时,如何可靠地获取对象的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6494591/

相关文章:

c++ - 如何在C++中表示无理数

c++ - 重载自定义迭代器的取消引用运算符

c++ - 为什么标准容器迭代器不重载 `->*` ?

c++ - 在字符串中存储多个十六进制值 C++

c++ - 使用opencv将图像从BGR转换为ARGB

c++ - 使用 Win API 确定可执行文件的实例是否已在运行

c++ - this_thread::sleep_for 和 C++11 标准指定的计时时钟之间的关系吗?

c++ - 在 C++11 中存储对方法的引用时出错

c++ - std::map 的这两种列表初始化形式有什么区别?

c++ - C++类中的运算符重载