【问题标题】:string as a return value in c++ function字符串作为c ++函数中的返回值
【发布时间】:2023-03-10 16:54:01
【问题描述】:

这是一个基本问题,但我并不完全理解。 当我有这样的功能时:

string func(){
        string result;
        result = "resultString";

        return result;
}

这样可以还是字符串结果只是一个局部变量(可以超出范围)?

如果可以,为什么?这是价值回报吗?

c++中哪些类型是按值返回的,按引用返回什么?

【问题讨论】:

  • Google for:RVO,移动语义并按值返回
  • 你正在做的很好。在 C++ 中,一切都是按值返回的。
  • @LukePark 除了返回一个参考。
  • 引用实际上是在返回时复制到内存中的,就像一个指针一样。 从技术上来说,你仍然在返回一个值。
  • @LukePark 它与 C++ 标准中指定的不同。它可能以与例如相同的方式实现。指针返回,但可能不会。例如,语义差异对于优化很重要。

标签: c++ string function return-value


【解决方案1】:

这样可以还是字符串结果只是一个局部变量?

这很好。返回一个值,尽管它可能受 NRVO 约束。

如果可以,为什么?这是价值回报吗?

是的。您将string 写为返回类型,这意味着一个值。

c++中哪些类型是按值返回的,按引用返回什么?

在 C++ 中,您可以很好地控制它。 string f(); 表示返回 string 类型值的函数。 string& f(); 返回对此类值的引用。

【讨论】:

    【解决方案2】:

    如果可以,为什么?这是价值回报吗?

    作为对先前答案的补充,我想说 result 是一个局部变量;由于 func() 原型指定返回是按值,而不是引用,c++ 编译器实际上将调用 std::string 复制构造函数以使用结果局部变量的副本初始化 func() 返回值(请注意,如果由你的代码,c++编译器会创建一个,只实现浅拷贝)

    【讨论】:

    • 由于 NRVO 或移动语义,可能无法调用复制构造函数。事实上,在上面的代码中,它很可能不会被调用。
    • 没错,复制构造函数不会总是被调用,它取决于编译器的行为。
    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多