luc*_*obz 5 c++ constructor return curly-braces c++11
我是 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?
}
Run Code Online (Sandbox Code Playgroud)
return {1, 2};,返回值是从列表初始化的{1, 2},作为效果,返回的std::vector<double>包含 2 个值为1和 的元素2。
return std::vector<double>{1, 2};,返回值是从复制初始化的std::vector<double>{1, 2},作为效果,返回的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。强制复制省略在这种情况下也有效。