使用大括号返回构造函数参数?

5

我刚接触C++,花括号初始化(或统一初始化)真的很令人困惑。当函数返回用花括号括起来的参数列表时,具体会发生什么?非常感谢您的澄清。

std::vector<double> foo()
{
  return {1, 2}; // is this the same as: std::vector<double>{1, 2} or std::vector<double>(1, 2)? or something else?
}
1个回答

9

return {1, 2}; 返回值是从 列表初始化{1, 2},作用是返回的std::vector<double> 包含值为 12 的两个元素。

return std::vector<double>{1, 2}; 返回值是从 拷贝初始化std::vector<double>{1, 2},作用是返回的std::vector<double> 包含值为 12 的两个元素。在概念上,它会构造一个临时的 std::vector<double> 对象,返回值则是由该对象进行拷贝初始化得到的。因为自 C++17 起具有强制拷贝省略(mandatory copy elision),所以拷贝/移动操作被省略了,其效果与第一种情况完全相同。

return std::vector<double>(1, 2)返回值是从 std::vector<double>(1, 2) 拷贝初始化得到的,作用是返回的std::vector<double> 包含值为 2 的一个元素。在这种情况下也会启用强制拷贝省略。


那么返回 {1, 2} 等同于调用 std::vector<double> temporary{1, 2} 吗?其余的涉及复制吗? - lucmobz
@lucmobz 由于C++17引入了复制省略技术,因此效果是相同的。 - songyuanyao
好的,但如果它们是等价的,那么用大括号返回可以节省输入类型名称的时间? - lucmobz
@lucmobz 是的,少打字。 - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接