大括号初始化(或统一初始化)确实令人困惑。当函数返回大括号中的参数列表时到底会发生什么?
std::vector<double> foo()
{
//is this the same as: std::vector<double>{1, 2}
//or std::vector<double>(1, 2)?
//or something else?
return {1, 2};
}
return {1, 2};
,返回值是来自{1, 2}
的list-initialized,因此返回的
std::vector<double>
包含2个值为1
和2
的元素。
return std::vector<double>{1, 2};
,返回值是std::vector<double>{1, 2}
的copy-initialized,因此返回的
std::vector<double>
包含2个值为1
和2
的元素。从概念上讲,它将构造一个临时的 std::vector<double>
并且返回值是从临时的复制初始化的;由于强制复制省略(C++17 起),复制/移动操作被省略,效果与第一种情况完全相同。
return std::vector<double>(1, 2)
,返回值是从std::vector<double>(1, 2)
复制初始化的,因此返回的std::vector<double>
包含1个值为2
的元素。强制复制省略在这种情况下也生效。