返回大括号中的构造函数参数?

问题描述 投票:0回答:1

大括号初始化(或统一初始化)确实令人困惑。当函数返回大括号中的参数列表时到底会发生什么?

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};
}
c++ c++11 constructor return curly-braces
1个回答
9
投票

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
的元素。强制复制省略在这种情况下也生效。

© www.soinside.com 2019 - 2024. All rights reserved.