将非const左值引用绑定到C++ 11中的rvalues是否有效?(已修改)

Fra*_*ahm 6 c++ rvalue lvalue c++11 visual-studio-2012

我知道在c ++ 03中,非const引用不能绑定到rvalues.

T& t = getT();是无效的,在c ++ 11中,我们可以这样做:T&& t = getT(); 但是上面的代码怎么样,应该在c ++ 11中工作?

我用vs11测试了下面的代码:

 Foo getFoo() {
  return Foo();
}

void fz(Foo& f) {
}

int getInt() {
  return int();
}

void iz(int& i) {
}

int main() {
  {
    Foo& z = getFoo(); //ok
    fz(getFoo()); //ok

    int& z2 = getInt(); //error: initial value of reference to non-const must be an lvalue
    iz(getInt()); //same as above
  }
}
Run Code Online (Sandbox Code Playgroud)

Foo是一个自定义类,我不明白为什么前两行编译.临时引用的z是在main的内部范围的末尾被破坏.标准是否对此有所说明?

class Foo {
public:
  Foo() {
    std::cout << "constructed\n";
  }
  ~Foo() {
    std::cout << "destructed\n";
  }
};
Run Code Online (Sandbox Code Playgroud)

我刚刚看到一个类似的问题:一个VS2010错误?允许将非const引用绑定到rvalue而不发出警告?

And*_*owl 5

应该在c ++ 11中工作吗?

不,它不应该.

Foo 是一个自定义类,我不明白为什么前两行编译

它仅与MSVC编译.MSVC有一个(可以说是有用的)编译器扩展,允许将用户定义类型的左值绑定到右值,但标准本身禁止这样做.例如,请参阅此实时示例,其中GCC 4.7.2拒绝编译您的代码.

标准是否对此有所说明?

确实如此.根据C++ 11标准的第8.5.3/5段:

对类型" cv1 T1"的引用由类型" "的表达式初始化,cv2 T2如下所示:

- 如果引用是左值引用和初始化表达式

- 是左值(但不是位域)," cv1 T1"与" cv2 T2,"或"是"参考兼容

- 具有类类型(即,T2类类型),其中T1不与引用相关T2,并且可以隐式转换为类型" cv3 T3," 的左值,其中" cv1 T1"与" cv3 T3"[...] 引用兼容,

然后,引用绑定到第一种情况下的初始化表达式lvalue和第二种情况下转换的左值结果(或者,在任何一种情况下,绑定到对象的相应基类子对象).[...]

[...]

- 否则,引用应是对非易失性const类型的左值引用(即,cv1应为const),或者引用应为右值引用.[ 例如:

double& rd2 = 2.0; // error: not an lvalue and reference not const
int i = 2;
double& rd3 = i; // error: type mismatch and reference not const
Run Code Online (Sandbox Code Playgroud)

- 末端的例子 ]