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