【问题标题】:What is better: return std::string by value or by constant reference? [duplicate]什么更好:按值或常量引用返回 std::string? [复制]
【发布时间】:2015-10-03 02:06:31
【问题描述】:

这是一个有两个返回类型不同的 getter 的类:

class A {
    std::string m_test { "test" };

public:
    std::string test_by_value { return m_test; }
    const std::string& test_by_const_ref() { return m_test; }
};

// ...

哪个更好?它是关于 std::string,而不是内置类型。 是 S.T.L.在https://channel9.msdn.com/Events/GoingNative/2013/Don-t-Help-the-Compiler 中说最好按值返回,因为会优化多个副本?还是我理解错了?

【问题讨论】:

  • 您想要一份副本还是一份参考资料?这应该会为您解答您的问题。
  • 什么更好?设计?表现?如果有,是记忆还是时间?
  • 1. 如果A 对象的寿命将超过引用的范围并且您需要它只读,则由const reference& 返回。 2. 如果A 对象超出范围和/或您需要复制/修改它,则返回value3. 如果您需要修改原始值返回,而它仍在范围内,reference&。 --- 不返回引用然后复制修改它,总是返回值用于写访问。
  • @CodeAngry 知道程序的其余部分将如何使用它不是课堂的事情。通过引用返回是最好的方法,因为使用该类的人可以决定使用引用或复制变量。

标签: c++ c++11 return-type return-by-reference return-by-value


【解决方案1】:

按价值。

我在野外遇到过类似的代码:

A foo();

std::string const& x = foo().test_by_const_ref();

Boom,x 是一个悬空引用。

按值返回不会发生这种情况。

【讨论】:

    【解决方案2】:

    链接正确,按值返回string对象。 NRVO 将负责返回引用而不是在幕后,因此您的代码将是完美的语义和干净的。

    【讨论】:

    • 这意味着他想要一个字符串的副本。他可能只想检查字符串。
    • 那你误读了。
    【解决方案3】:

    按值返回,因为编译器会优化返回值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2017-12-03
      • 2011-03-07
      • 2020-07-31
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多