右值与否参考
Reference for rvalue or not
我想知道下一个代码能否正确处理 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();
这将临时绑定到引用。临时文件的生命周期将延长以匹配 v
的生命周期。 (甚至在右值引用出现之前,C++03 就支持将临时对象绑定到 const 引用。)
const auto& v2 = v;
这只是对同一对象的另一个引用。它基本上是一个空操作,将在编译期间被消除。只要 v2
的寿命不超过 v
(在这种情况下不会),就没有问题。
我想知道下一个代码能否正确处理 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();
这将临时绑定到引用。临时文件的生命周期将延长以匹配 v
的生命周期。 (甚至在右值引用出现之前,C++03 就支持将临时对象绑定到 const 引用。)
const auto& v2 = v;
这只是对同一对象的另一个引用。它基本上是一个空操作,将在编译期间被消除。只要 v2
的寿命不超过 v
(在这种情况下不会),就没有问题。