我认为重载地址运算符&
是危险的,因为很容易忽略std::addressof()
在实现实际需要的模板时的使用。不过,我想知道重载此运算符的正确用例是什么。特别是,标准库中是否有任何类(模板)执行此操作?最后,由于自{+ 1}}引入了自C ++ 11以来,有没有办法在C ++ 03中获取具有此重载的对象的地址?
答案 0 :(得分:2)
&
经常被重载,因为它使它们更容易使用:通常你需要裸管理指针,不智能指针的地址对象
忽略std::auto_ptr
的进化回水,自{C ++ 11}以来,智能指针类如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以非凡的速度做到了这一点。
答案 1 :(得分:0)
不,唯一的方法是C ++ 11或更高版本中的std::addressof()
,或者早期版本的实现,见上文:
template< class T >
T* addressof(T& arg)
{
return reinterpret_cast<T*>(
&const_cast<char&>(
reinterpret_cast<const volatile char&>(arg)));
}