c++ - 大括号初始值设定项列表作为函数参数
问题描述
忽略编译器的复制/移动省略,我想知道以下代码(假设 foo 有一个接受三个整数的构造函数)“语法上”创建一个临时对象,然后复制/移动初始化函数参数,还是直接调用构造函数:
void acceptsFoo(foo a);
acceptsFoo({1, 2, 3});
而这个案子呢?
//ignoring RVO optimization
foo returnsFoo()
{
return {1, 2, 3};
}
我知道下面的代码,即使没有复制/移动省略,也与调用构造函数相同,因此不会生成任何临时代码,但我找不到有关上面代码的信息。
foo = { 1, 2, 3 } //assuming the constructor is non-explicit
foo { 1, 2, 3 }
解决方案
当使用花括号初始化列表初始化对象时,它用于初始化对象。时期。
将花括号初始化列表应用于函数参数意味着根据列表初始化规则使用值列表初始化该参数。当你返回一个braced-init-list时,它被用来用值列表初始化返回值对象,符合列表初始化的规则。
理论上没有临时对象被复制到参数/返回值中。
现在(C++17 之前),如果你已经完成了acceptsFoo(foo{1, 2, 3});
or return foo{1, 2, 3}
,那么这将引发一个临时的创建,然后将用于初始化参数/返回值。
推荐阅读
- java - 从 Firebase 实时数据库中获取 url 值
- r - 按 R 中连续发生的条件过滤
- javascript - JS 中的 Libp2p DHT 对等点发现示例
- c# - Azure Devops 未在发布配置中构建
- react-native - 注销反应应用程序会导致主屏幕出现空指针
- bash - bash - 不以“.gz”结尾的 gzip 文件
- ruby-on-rails - 在“capture_haml”块内使用时,React on Rails 组件不呈现
- python - 漂亮的打印嵌套字段
- asp.net-core - 显示包含 HTML 的文本子字符串
- python - 将大小不均匀的列表转换为 LSTM 输入张量