作为一个新手,我发现在C++书籍中从函数返回的解释相当神秘.
以下是我理解的摘要,希望有人可以纠正它:
物业:
T foo() {
...
return expr;
}
main() {
T var = foo();
}
Run Code Online (Sandbox Code Playgroud)
我对回归过程的理解是否正确?
expr隐式转换为声明的函数返回类型T.这种转换发生在 foo();varmain()中的变量.欢迎任何输入!
让我们系统地解决这个问题.
如果函数被声明为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锁定时才能调用.上面的代码正确而简洁地完成了这一过程.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |