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

Tom*_*ica 2 c++ pointers iterator

我有一些问题转换std::list<MyType>::iteratorMyType*.我有一个数组,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);
}
Run Code Online (Sandbox Code Playgroud)

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

&*it
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 7

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

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

无论这两个步骤需要复制MyType数据.

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