我知道在C++ 03中,非const引用不能綁定到右值。在C++ 11中將非常量左值引用綁定到右值是否有效?(已修改)
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
}
}
Foo
是一個自定義類,我不理解爲什麼前兩個行compiles.The臨時由z
引用在內的端部被破壞主要範圍。標準是否對此有所說明?
class Foo {
public:
Foo() {
std::cout << "constructed\n";
}
~Foo() {
std::cout << "destructed\n";
}
};
我剛纔看到一個類似的問題:One VS2010 bug ? Allowing binding non-const reference to rvalue WITHOUT EVEN a warning?
有意思的是幾*的Objective-C或Java程序員如何*詢問像面向語言的深奧的問題「是不是有效綁定右值到非常量左值引用...?「或者不得不關注像「臨時引用......在內部作用域結束時被破壞」的東西。只是說';) – paulsm4 2013-05-11 03:55:17
你可以發佈你如何定義Foo。 – Gisway 2013-05-11 04:05:00
約束力的規則並沒有改變WRT左值引用AFAIK – 2013-05-11 04:34:13