C++ 是否为右值的引用
我想知道下一个代码是否能正确使用v和v2变量,或者这些是临时变量的引用?换句话说,我可以通过引用捕获返回的右值吗?我不这么认为,但我的队长会换一种方式思考C++ 是否为右值的引用,c++,c++11,reference,lifetime,const-reference,C++,C++11,Reference,Lifetime,Const Reference,我想知道下一个代码是否能正确使用v和v2变量,或者这些是临时变量的引用?换句话说,我可以通过引用捕获返回的右值吗?我不这么认为,但我的队长会换一种方式思考 #include <iostream> struct Foo { Foo(Foo&&) = delete; Foo& operator=(Foo&&) = delete; Foo() { std::cout << "Constructor" <<
#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;
}
#包括
结构Foo{
Foo(Foo&&)=删除;
Foo&运算符=(Foo&&)=删除;
Foo(){
std::cout是,其行为已定义
const auto& v = foo();
这会将临时对象绑定到引用。临时对象的生存期将被延长,以匹配v
的生存期(甚至在右值引用出现之前,C++03就支持将临时对象绑定到常量引用。)
这只是对同一对象的另一个引用。它基本上是一个no op,在编译过程中会被消除。只要v2
不超过v
(在本例中不是这样)那么就没有问题了。我的意思是…把它放到编译器中,看看它说什么?它工作正常,但对于mee来说,似乎v和v2变量捕捉临时值的引用会导致SEGFAULTBinding将临时值绑定到常量引用,从而将临时值的生存期延长到引用的生存期。因此,像a这样的表达式uto v&=(1-2)
也会正确,是吗?@voltento,不,它必须是常量引用。@voltento如果你真的是指auto&v=(1-2);
那么不是。你不能将临时引用绑定到非常量引用。它必须是常量。因此const auto&v=(1-2)
可以工作。注意auto&v=(1-2)
在C++11中也可以。
const auto& v2 = v;