我想知道下一段代码是否可以正确处理 v 和 v2 变量,或者这些是临时变量的引用?换句话说,我可以通过引用捕获返回的右值吗?我不这么认为,但我的团队负责人有另一种想法。
#include <iostream>
struct Foo {
Foo(Foo&&) = delete;
Foo& operator=(Foo&&) = delete;
Foo() {
std::cout << "Constructor" <<std::endl;
}
Foo(const Foo&) {
std::cout << "Copy Constructor" <<std::endl;
}
Foo& operator=(const Foo&) {
std::cout << "Copy = Constructor" <<std::endl;
return *this;
}
~Foo() {
std::cout << "Destructor" <<std::endl;
}
};
Foo foo() {
Foo v;
return v;
}
int main() {
const auto& v = foo();
const auto& v2 = v;
return 0;
}
最佳答案
是的,this works fine并且定义了它的行为。
const auto& v = foo();
这将临时绑定(bind)到引用。临时对象的生命周期将延长以匹配 v
的生命周期。 (甚至在右值引用出现之前,C++03 就支持将临时对象绑定(bind)到 const 引用。)
const auto& v2 = v;
这只是对同一个对象的另一个引用。它基本上是一个空操作,将在编译期间被消除。只要 v2
没有超过 v
(在本例中没有),就没有问题。
关于c++ - 右值与否引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50724163/