我们有Myclass &funcref();
和Myclass 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?
}
主要问题:除了b是const外,a
和b
之间是否有区别?两者似乎都在main的堆栈上,所以它们有什么区别吗?
答案 0 :(得分:0)
如果我理解正确,则在两种情况下我们都使用复制构造函数。
不完全是。在C ++ 11中,在Myclass func()
的情况下将使用move构造函数(并且允许编译器优化复制/移动)。
自C ++ 17起,Myclass func()
既不移动也不复制。
在任何情况下,这两者会有所不同吗?
目前尚不清楚您要询问的情况。函数返回引用的情况会有所不同。
如果我正在调用任何返回非引用的函数,我应该将输出分配为引用,还是不分配为引用?
通常,您应该使用一个对象变量,因为它更简单并且不涉及必须了解引用绑定的临时生命周期扩展规则的认知负担。
只有在我能想到的情况下,prvalue的引用变量才有意义的地方是模板上下文,在该上下文中,被调用函数可能会返回引用,或充当引用包装的非引用对象。我认为,这种情况是存在临时延长寿命的原因。