检查我对功能返回的理解

6 c++ function

作为一个新手,我发现在C++书籍中从函数返回的解释相当神秘.

以下是我理解的摘要,希望有人可以纠正它:

物业:

T foo() {
   ...
   return expr;
}

main() {
   T var = foo();
}
Run Code Online (Sandbox Code Playgroud)

我对回归过程的理解是否正确?

  1. 评估结果expr隐式转换为声明的函数返回类型T.这种转换发生 foo();
  2. 上面转换的值用于初始化临时对象,比如"x".子问题:第二次转换是在foo()还是main()中发生的?
  3. 临时对象"x"用于初始化varmain()中的变量.

欢迎任何输入!

Ker*_* SB 6

让我们系统地解决这个问题.

如果函数被声明为T f();,而T不是void,并且函数正常返回,那么它必须通过表单的语句返回return e;,其中e是表达式.

评估函数调用表达式时f(),将获得一个值.假设U表示对象类型.如果T = U &或者T = U &&,则值是类型U,表达式e必须能够绑定到引用,返回值e.(就其价值类别而言,返回值也是所谓的"glvalue").在这种情况下没有其他事情发生.函数调用的值是返回的东西.

然而,当时T = U,则值f()是所谓的"prvalue"("纯rvalue"),这就需要构造类型的临时对象U.该对象被构造为U obj = e(即从中隐式转换e).f()那么值就是这个临时对象.它可以用于初始化另一个对象(例如U x = f();),或者它可以绑定到引用(例如U && r = f();).

返回表达式e与函数调用值的绑定作为函数体范围内的最后一件事发生.值得注意的是,这是范围结束之前,即在范围本地对象被销毁之前.例如,如果在构造返回值对象期间抛出异常,则在异常传递给调用范围之前,必须发生范围展开以销毁本地对象.另一个有用的例子可能是使用范围保护,例如互斥锁:

U f()
{
    std::locK_guard<std::mutex> lock(state_mutex);
    return state.get_value();
}
Run Code Online (Sandbox Code Playgroud)

这里我们假设初始化U obj = state.get_value();是有意义的,我们进一步假设state.get_value()只有在state_mutex锁定时才能调用.上面的代码正确而简洁地完成了这一过程.