gpt4 book ai didi

c++ - 为什么初始化列表会产生 2 个数据拷贝,而不仅仅是将一个拷贝传递给函数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:13 27 4
gpt4 key购买 nike

如果我们创建一个简单的虚拟类如下:

struct example {
example() { std::cout << "Create" << std::endl; }
example(const exam&) { std::cout << "Copy" << std::endl; }
example(example &&) noexcept { std::cout << "Move" << std::endl; }
}

并将其传递到初始化列表 ( std::initializer_list<example> ) 中:

some_function({example()});

输出(来自 GCC/C++11)是:

Create
Copy
Copy

这对我来说没有意义,因为您创建示例对象本身然后通过 initializer_list 传递它.这意味着你有原始对象,你的列表有一个对象的拷贝,你的函数有一个 list 的拷贝(不是示例对象)暗示它应该是你的对象的单一创建然后是初始化列表的单个拷贝。

预期输出(没有额外的拷贝):

Create (from example())
Copy (into initializer_list)

TL;DR:如果对象在初始化列表本身中传递,为什么通过初始化列表传递我的对象会实例化该对象的两个拷贝而不是一个拷贝?

#include <iostream>
#include <initializer_list>

struct example {
example() { std::cout << "Create" << std::endl; }
example(const example &) { std::cout << "Copy" << std::endl; }
example(example &&) noexcept { std::cout << "Move" << std::endl; }
};

void some_function(std::initializer_list<example> input) {
for (example exam : input) {
std::cout << &exam << std::endl;
}
}

int main()
{
example exam;
some_function({exam});
}

最佳答案

第二个拷贝与初始化列表本身无关。当您“按值”迭代列表时,第二个拷贝在您的 some_function 中创建

for (example exam : input) {
std::cout << &exam << std::endl;
}

如果您“通过 const 引用”对其进行迭代,则第二个拷贝将消失。

关于c++ - 为什么初始化列表会产生 2 个数据拷贝,而不仅仅是将一个拷贝传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46082490/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com