首页 > 解决方案 > 通过引用使用变量

问题描述

我们有Myclass &funcref();andMyclass func();并将返回值分配给一个变量(不是变量引用)。如果我理解正确,我们在这两种情况下都使用复制构造函数。唯一的区别是funcref()返回一个引用,我们将引用的内容复制到我们的对象中,而在 中func(),我们在返回时复制对象。

如果我们将它分配给一个变量引用,func()仍然只需要一个复制构造函数。

我希望到目前为止一切都是正确的——如果不是,请指出我的误解。

现在我的问题:

似乎我们是否将返回值分配给func()变量或变量引用,它根本没有改变任何东西?在任何情况下,这两者会有所不同吗?至少当他们被分配时,看起来过程是一样的,但我可能错了。

在代码中:

class My_class {
    //Anything may be here
};

My_class func();
My_class &funcref();

int main() {
    My_class a = func(); //Copy operator used?
    const My_class &b = func(); //Why does this need to be constant? Also, this uses copy operator, right?
    My_class c = funcref(); //Copy operator used?
    My_class &d = funcref(); //Here, we do not need a copy operator, right?
}

a主要问题:除了 b 是 const 之外,和 之间有什么区别b吗?两者似乎都在 main 堆栈上,所以它们有什么不同吗?

标签: c++c++11

解决方案


如果我理解正确,我们在这两种情况下都使用复制构造函数。

不完全的。在 C++11 中,将使用移动构造函数Myclass func()(并且允许编译器优化复制/移动)。

从 C++17 开始,在Myclass func().

在任何情况下,这两者会有所不同吗?

你问的是什么情况有点不清楚。在函数返回引用的情况下是有区别的。

如果我调用任何返回非引用的函数,我应该将输出分配为引用还是不作为引用?

通常,您应该使用对象变量,因为它更简单并且不涉及必须理解引用绑定临时生命周期扩展规则的认知负担。

我能想到的唯一情况是prvalue的引用变量是一个模板上下文,其中被调用的函数可能返回一个引用,或者一个充当引用包装器的非引用对象。我相信这种情况是存在临时延长寿命的原因。


推荐阅读