指针的地址和取消引用

时间:2017-12-15 15:32:39

标签: c++

我在“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; * ? 为什么不通过&#39; oo&#39;工作?

2 个答案:

答案 0 :(得分:3)

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

某些类对象,特别是迭代器(如std::vector::iterator),实现类似

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

这样他们就可以“解除引用”就像他们是指针一样。这称为运算符重载。

如果你想直接传递它,你必须确保有像

这样的成员函数
SomeClass::operator T*(void);

通过这种方式,可以通过调用该函数将这些对象隐式转换为相应的指针。否则你必须“取消引用”它,然后获取解除引用对象的地址。

答案 1 :(得分:1)

虽然您对&*相互取消指针是正确的,但uninitialized_move是一个模板函数,因此oo可能是非指针类型有一个自定义解除引用运算符*,例如迭代器。

对于那类明确的&#34;往返&#34;需要确保将static_cast应用于指针。