指针的地址和解雇

Address of and dereference on a pointer

本文关键字:和解 地址 指针      更新时间:2023-10-16

我在'C 编程语言'书中遇到了此功能。

template<typename In, typename Out> 
Out uninitialized_move(In b, In e, Out oo) {  
    using T = Value_type<Out>; // assume suitably defined type function (§5.4.2.1, §28.2.4)  
    for (; b!=e; ++b,++oo) {  
        new(static_cast<void*>(&*oo)) T{move(*b)}; // move construct  
        b–>~T(); // destroy
    }  
    return oo; 
}

位置新参数是&amp;*oo

为什么在该语句中需要&amp;*?为什么不只是通过" oo"工作?

如果oo不是指针,并且没有operator T*()超载,则不能直接作为指针传递。

某些类对象,尤其是迭代器(例如std::vector::iterator),都实现了

之类的东西
SomeStuff& SomeClass::operator*(void);

,可以像一样被"删除" 。这称为操作员超载。

如果要直接通过它,则必须确保有这样的成员函数,例如

SomeClass::operator T*(void);

通过这种方式,可以通过调用该功能将这些对象隐式转换为相应的指针。否则,您必须"解除"它,然后取下对象的地址。

尽管您对&的正确正确,并且*互相取消以换取指针,但uninitialized_move是一个模板函数,因此oo可以是具有自定义解码操作员*的非销售类型的类型。迭代器。

对于类似于类型的类型,需要明确的"往返"以确保将static_cast应用于指针。