gpt4 book ai didi

c++ - 检查我对函数返回的理解

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:10 25 4
gpt4 key购买 nike

作为新手,我发现C++书上关于函数返回的解释很晦涩。

这里总结一下自己的理解,希望大家指正:

场所:

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

main() {
T var = foo();
}

我对返回流程的以下理解是否正确?

  1. expr 的计算结果隐式转换为声明的函数返回类型T。此转换发生在 foo();
  2. 上面的转换值用于初始化一个临时对象,比如“x”。子问题:第二次转换是发生在 foo() 还是 main() 中?
  3. 临时对象“x”用于初始化main() 中的变量var

欢迎任何意见!

最佳答案

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

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

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

但是,当 T = U 时,f() 的值是所谓的“prvalue”(“纯右值”),这需要U 类型的临时对象 的构造。该对象如同由 U obj = e 构造(即从 e 隐式转换)。 f() 的值就是这个临时对象。它既可以用于初始化另一个对象(例如 U x = f();),也可以绑定(bind)到一个引用(例如 U && r = f();)。

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

U f()
{
std::locK_guard<std::mutex> lock(state_mutex);
return state.get_value();
}

这里我们假设初始化 U obj = state.get_value(); 是有意义的,我们进一步假设 state.get_value() 只能在state_mutex 被锁定。上面的代码正确而简洁地做到了这一点。

关于c++ - 检查我对函数返回的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com