【问题标题】:Returning constructor arguments in braces?在大括号中返回构造函数参数?
【发布时间】:2023-03-20 04:05:01
【问题描述】:

我是 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++ c++11 constructor return curly-braces


    【解决方案1】:

    return {1, 2};,返回值为list-initialized from {1, 2},作为效果,返回的std::vector&lt;double&gt;包含2个元素,值为12

    return std::vector&lt;double&gt;{1, 2};,返回值为copy-initialized from std::vector&lt;double&gt;{1, 2},作为效果,返回的std::vector&lt;double&gt;包含2个元素,值为12。从概念上讲,它将构造一个临时的std::vector&lt;double&gt;,并且返回值是从临时的复制初始化的;由于mandatory copy elision (C++17 起) 省略了复制/移动操作,效果与第一种情况完全相同。

    return std::vector&lt;double&gt;(1, 2),返回值是从std::vector&lt;double&gt;(1, 2)复制初始化的,结果返回的std::vector&lt;double&gt;包含1个值为2的元素。在这种情况下,强制复制省略也生效。

    【讨论】:

    • 所以返回 {1, 2} 相当于调用 std::vector 临时{1, 2}?其余的包含副本?
    • @lucmobz 由于copy elision(C++17 起),效果是一样的。
    • 好的,但是如果它们是等价的,那么用大括号返回就可以省去输入类型名称了?
    • @lucmobz 是的,少打字。
    猜你喜欢
    • 2013-10-03
    • 2013-03-02
    • 2021-01-08
    • 2015-06-29
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多