C++ 是否为右值的引用

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" <<

我想知道下一个代码是否能正确使用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;
}
#包括
结构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;