1

我认为重载 address-of operator 是危险的,因为在实现实际需要它&的模板时很容易忽略使用。std::addressof()不过,我想知道重载此运算符的正确用例是什么。特别是,标准库中是否有任何类(模板)可以做到这一点?最后,既然std::addressof()是从C++11开始引入的,有没有什么办法可以获取C++03中有这个重载的对象的地址呢?

4

2 回答 2

2

&在构建智能指针类时通常会重载,因为它使它们更易于使用:通常您需要裸托管指针,而不是智能指针对象的地址。

忽略进化的死水,自 C++11 以来std::auto_ptr,智能指针类std::unique_ptrstd::shared_ptr已被引入标准。由于偶尔需要获取对象的真实std::addressof地址,因此在该标准中引入了。

一个可能的实现std::addressof是微不足道的,但由于所需的铸造量而异味;一个可能的实现是1

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

重载的其他更奇特的用途&是支持 EBNF 语法解析器。Boost Spirit 以非凡的敏捷性做到了这一点。


1引自http://en.cppreference.com/w/cpp/memory/addressof

于 2018-03-09T11:45:56.390 回答
0

不,唯一的方法是std::addressof()在 C++11 或更高版本中,或其早期版本的实现,见上文:

template< class T >
T* addressof(T& arg) 
{
    return reinterpret_cast<T*>(
               &const_cast<char&>(
                  reinterpret_cast<const volatile char&>(arg)));
}
于 2018-03-09T11:46:20.420 回答