我认为重载 address-of operator 是危险的,因为在实现实际需要它&
的模板时很容易忽略使用。std::addressof()
不过,我想知道重载此运算符的正确用例是什么。特别是,标准库中是否有任何类(模板)可以做到这一点?最后,既然std::addressof()
是从C++11开始引入的,有没有什么办法可以获取C++03中有这个重载的对象的地址呢?
问问题
335 次
2 回答
2
&
在构建智能指针类时通常会重载,因为它使它们更易于使用:通常您需要裸托管指针,而不是智能指针对象的地址。
忽略进化的死水,自 C++11 以来std::auto_ptr
,智能指针类std::unique_ptr
和std::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 以非凡的敏捷性做到了这一点。
于 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 回答