我在“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;工作?
答案 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
应用于指针。