& * x操作是否会创建副本?

时间:2015-11-13 16:39:23

标签: c++ pointers iterator

我在将std::list<MyType>::iterator转换为MyType*时遇到了一些问题。我有一个MyType数组,当我遍历它时,我调用了一些void doSomething(const MyType* thing)。最终我这样做:

std::list<MyType> types = ... something here ...;
for( std::list<MyType>::const_iterator it = types.begin(), end = types.end(); it != end; ++it ) {
    doSomething(&*it);
}

我的问题是,我是否通过此操作创建MyType的内存副本:

&*it

尝试简单地传递迭代器就像它是指针一样,或者将迭代器强制转换为指针引发的编译器错误。

4 个答案:

答案 0 :(得分:7)

不,*&的序列不会创建副本:

    应用于迭代器的
  • *生成引用
  • &应用于引用会生成原始地址

这两个步骤都不需要复制MyType数据

注意:如果存在重载运算符&,则使用std::address_of(*it)表达式会更安全。

答案 1 :(得分:2)

迭代器的一个要求是它是可以降级的 - 即支持*it。见http://en.cppreference.com/w/cpp/concept/Iterator。是否指定了*it返回引用或副本。

理论上,使用*it时,实现可以返回副本。

实际上,大多数实现在使用*it时都会返回引用。因此,在使用&*it时,您很可能不会看到副本。

答案 2 :(得分:0)

只要迭代器有效,它就可以满足您的需求。不,它不会创建副本。

答案 3 :(得分:0)

根据代码的编写方式,您将创建指针的副本,但不应复制指针指向的内存。

分解,你获取迭代器对象(it),查看迭代器(MyType)引用的*it对象,然后获取该对象的地址( &*it)。然后将指针复制到函数中并根据需要使用。