【问题标题】:Return std::array by value按值返回 std::array
【发布时间】:2019-02-19 01:37:12
【问题描述】:

一个简单的问题,但我无法在 SO、cppreference.com 和类似网站上找到答案。

像这样按值返回std::array 是否合法?

std::array<int, 3> f() {
   return std::array<int, 3> {1, 2, 3};
}

如果合法,那么按值传递给函数也是合法的,对吧?

【问题讨论】:

  • 为什么不合法?这是其引入的核心目的之一。
  • 鉴于 std::array 是具有默认构造函数的(模板)对象 ....
  • std::array copy semantics的可能重复
  • 如正确回答,您的第一个版本很好,但请注意:您的替代版本不好。它将编译,但它返回一个对立即被销毁的临时对象的引用。
  • @VioletGiraffe 差不多。唯一的例外是您有时可能希望返回对传入的按引用参数的引用,其中参数可以引用临时对象。

标签: c++ arrays c++11


【解决方案1】:

是的,这是合法的。这是使用它而不是 C 样式数组的优点之一,它不会衰减。它会做你期望它做的事情,明智地复制数组元素,在这种情况下它只会调用 RVO。

正如 cmets 中已经说过的,您的第二个版本并不安全。它会构造一个临时的并通过 ref 返回它,这将导致你最终得到一个悬空的 r ref。

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2012-06-30
    • 2017-10-13
    • 1970-01-01
    • 2018-05-26
    • 2014-01-15
    • 2012-10-25
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多