【问题标题】:Does &*x operation create a copy?&*x 操作是否创建副本?
【发布时间】:2015-11-13 16:39:23
【问题描述】:

我在将 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

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

【问题讨论】:

    标签: c++ pointers iterator


    【解决方案1】:

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

    • * 应用于迭代器会产生一个引用
    • &amp; 应用于引用会产生原始地址

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

    注意:当可能存在重载运算符&amp; 时,使用std::address_of(*it) 表达式会更安全。

    【讨论】:

    • &amp; 可以被覆盖,这让我感到害怕。但同时我很高兴 C++ 什么都不怕。
    【解决方案2】:

    迭代器的一个要求是它是可取消引用的——即支持*it。见http://en.cppreference.com/w/cpp/concept/Iterator。未指定*it 是返回引用还是副本。

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

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

    【讨论】:

      【解决方案3】:

      只要迭代器有效,它就会做你想做的事。不,它不会创建副本。

      【讨论】:

        【解决方案4】:

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

        分解一下,你拿迭代器对象(it),你看看迭代器(*it)引用的MyType对象,然后得到这个对象的地址(&amp;*it)。然后将指针复制到函数中并根据需要使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-06
          • 2022-11-10
          • 1970-01-01
          • 2014-05-25
          • 2017-08-13
          • 2018-06-08
          相关资源
          最近更新 更多